I've always felt like it was a bad first language because there's all of this type stuff going on under the hood that isn't really hidden from the user. I think go/java are probably better first language because they're more explicit with the typing.
Java in particular, because the fact that it's so verbose and has so much boiler plate, I think, is actually good for a new programmer.
Couldn't disagree more. I don't know why programmers think there's merit in making things harder than they have to be. There's nothing wrong with learning about strong typing later on. Python is so much more readable and easier to understand than any strongly typed language.
This is not about being "hard". Python is, actually very hard... except you don't know it well, and mistakenly think it's easy. You probably had never seen more than half of the functionality available in the "standard" library, i.e. you don't even know it exists, for example. Now, add to this that there isn't really one Python. There's a succession of similar languages, all called Python. But, can you tell in which version object of "module" type gained all the attributes of their alleged superclass -- "object"? How many facts like this one do you think exist?
There are also different ways things can be hard. Some things are hard to understand once -- and then once you understand, no extra effort is required. You just go around knowing it. Some things could be hard because nobody can explain them to you, and you will be running up against the wall trying to figure them out. Some other things are hard because they are always in flux. You think you've understood them, but the next moment someone is pulling the carpet from under you, and you have to start understanding them all over again.
I still remember my disappointment, for example, when after second semester of automata theory, we ended up constructing "mini machines" -- short sequences of instructions that could be combined to build bigger programs. And then we went straight to Java. There was no continuity. Nobody cared or even could explain how, if you wanted to build from the first principles could you get Java. The step between "mini machines" and Java was never explained. There was no explanation for why should Java have such and such feature, or what would have happened if it hadn't etc.
People are masters of reconciling inconsistencies, and not in a good way. When something doesn't make sense, people will masterfully invent some cooked-up nonsense to replace the real explanation. And this is the case for most CS majors. When you ask them questions about basic things about their trade, what you hear back is some laughable excuse of an answer. We have several generations of programmers today who grew up with this nonsense, internalized it, made it into a cult. Python owes its popularity, in great part, to these generations of programmers with missing foundations, lacking ability of critical thinking which led to bizarrely distorted view of the world.
> But, can you tell in which version object of "module" type gained all the attributes of their alleged superclass -- "object"?
As someone who's day job is mostly Python, not off the top of my head, but I could probably find out if it was ever relevant to my work (finding information about Python is quite easy, which is one of its social strengths), which it would almost certainly not be, because in normal use of Python modules, it doesn't matter.
> How many facts like this one do you think exist?
Trivia that's irrelevant to most use of the language? Lots. So what? That doesn't make actual use hard.
> I still remember my disappointment, for example, when after second semester of automata theory, we ended up constructing "mini machines" -- short sequences of instructions that could be combined to build bigger programs. And then we went straight to Java. There was no continuity. Nobody cared or even could explain how, if you wanted to build from the first principles could you get Java. The step between "mini machines" and Java was never explained.
I can see why that might, to some tastes, make that course of study intellectually unsatisfying, especially if one both had an obsesssive need to see the whole picture but not the drive to do the obvious work laid out, implicitly, fior the student, but it seems like a non-sequitur when discussing whether or not Python is hard.
> But, can you tell in which version object of "module" type gained all the attributes of their alleged superclass -- "object"? How many facts like this one do you think exist?
None of those things matter to a beginner, what's important is minimizing friction, so they can actually learn programming without having their curiosity rewarded with a flood of compiler errors. Python is fantastic in that regard. No need to define a main function, no need to care about signed/unsigned int, printing out the contents of an array or dictinary directly is a single statement that won't just output a heap address, etc.
And when they learn about more advanced stuff they will understand why many languages do things differently, and Python will still be very useful for small scripts and prototypes.
That's where you are wrong. Beginners don't know that these things matter to them. But they very much matter.
> so they can actually learn programming
But they won't. They will become the "water from the toilet" idiots. Whatever they learn how to do will have no value, if they don't know how to do it well. Accidentally I saw this article today about how US military lowered IQ requirements for draftees during the Vietnam war, and how people with low IQ were five times as likely to die. You are suggesting to do thing wrong in hopes that it's somehow if you do it fast, nobody will notice? -- hell no. We already have armies of programmers who believe in strict static typing or in object-oriented programming. This will just add more idiots to their ranks.
> That's where you are wrong. Beginners don't know that these things matter to them. But they very much matter.
Could you specify why they matter for a beginner?
Because I've been using Python for quite a while and I can't answer your previous question about what specific Python version did that subclass attribute change. I think by the time such a detail comes up a "beginner" is already comfortable enough with the basics to learn about it. But in Python those basics tend to be more straightforward and riddled with less boilerplate and redundant syntax than in many other languages, which is nice because getting slowed down by those things when learning is frustrating.
> You are suggesting to do thing wrong in hopes that it's somehow if you do it fast, nobody will notice?
I'm suggesting that reducing friction in the first phases of learning programming is a worthwhile improvement and that the choice of language matters in this regard, nothing else. I didn't say a word about learning an entire language or learning programming up to the point which you call "knowing how to do it well".
> We already have armies of programmers who believe in strict static typing or in object-oriented programming. This will just add more idiots to their ranks.
Am I reading this correctly that you think relying on strict static typing is for idiots? Because I made the experience it's very helpful for maintaining code, in addition to other best practices of course.
They're not redundant and frustrating when you're a beginner. The repetition is good for you, and things still feel novel rather than repetitive and boring.
> But they won't. They will become the "water from the toilet" idiots.
This is, IME, not a function of what language people learn with first (ot second or...) but of their personality and desires. Most people who learn programming learn it as a means to an ends (often the latter is a paycheck) and will learn only as much as feels like a good payoff for the effort in that context. This isn't the fault of the language they start with, its just human nature.
You can't fix that things you thibk everyone should know about programming, and should want to know, actually don’t make sense to bother learning given most people’s actual utility function by using a different first language.
I think that for teaching, you can go too far and eliminated too much friction. In python in particular, there's all this type stuff going on under the hood that's absolutely critical in understanding what the output of your program is going to be, but nowhere in that program is it explicit what that type information is.
It's easy enough to keep track of that in your head once you've mastered the concept, but for a true beginner, I think
int x = console.nextInt();
String operation = console.next();
int y = console.nextInt();
is probably better suited for helping you get your bearings than having to figure out why you have to cast x and y after doing
Of course it's hard to completely understand Python inside and out. There are probably only a few dozen people in the world who do, or a few hundred max. And that's because for the vast majority of people it's completely unnecessary. If you want to go deeper then you're welcome to, but a new programmer is just going to get bogged down in unnecessary details if you try to introduce new concepts when he's just starting out. It's like saying the average PC user should understand the inner workings of GUIs. Makes no sense.
Why not C then? Java has more "just do this because it's the way it is". I think it depends on why someone is learning to program, generally I think python is fine for say a mechanical engineer that has to do some scripting, C is good for, as you say, understanding what's happening under the hood, exposing pointers in particular.
The array-pointer decaying magic in C requires too much mind-bending. Most of the standard library for string processing is insecure. No boolean types. No name-spacing. One-line if bugs (ridiculously common for beginners and even experts). I could go on and on. Frankly - I would have preferred to learn assembly as a first language rather than C in my college days.
I think with C, learning how the pdp11 worked gets in the way of learning how to program. I think most people should eventually learn C, but control flow should come first, and java provides more guard rails. No `char *` and no segfaults.
Boiler plate gets in the way of solving the problem you're writing code for. IMHO it's too much detail to force on someone new. There are reasons not to use python, but it's better to let people discover them than to try to explain it all up front.
If you're just trying to hack something together and make it work, I'd agree that python is the best, even for somebody who's never written a line of code in their life.
If you're trying to train somebody to be a software engineer, rather than just automating a particular data entry task as quickly as possible, I think boiler plate is good. It's better to force the details on the person at first than to have them be hidden, automatic, and mysterious forever.
In practice I assume Javascript is the leader language for onbording new people. The speed to go from learning-the-language to useful results has to be best in Javascript.
Every time I need to work in JavaScript (which happens only a few times a year), just getting build scaffolding to work is so very hard. The gulf from "you understand the language's syntax" to "you can build something useful following commonly-agreed conventions" is vast. Not to forget that these conventions significantly change every few months.
Use Deno. You don't need to deal with `package.json` and `node_modules`. You can have full programs in a single script that import their dependencies within the script. The build scaffolding can range from 0 to whatever you need.
I actually returned to JS scripting after a long hiatus thanks to Deno. And now like the language a lot more.
Java in particular, because the fact that it's so verbose and has so much boiler plate, I think, is actually good for a new programmer.