The first language we started with was SML and for a good couple of months I just laughed at this stupid language with its silly and unnecessary limitations. It wasn't until we had to implement a parser in it, something I coincidentally had struggled with on my own, that I started to realize that I was dealing with a different paradigm, and a very powerful one at that.
I was less cocky after that.
Got to undergrad. Followed the speed limit, took intro to programming course. 450 person class, 1000 person wait-list. 75% of the class did not pass. Only attended two lectures, hand written programming finals. Never lost a point.
It wasn't until the 3rd year programming languages class that we wrote minimal lisp interpreters in scheme and did crazy stuff in prolog that I had that rewiring sensation.
Not trying to brag, just putting this here for others reading to say that not every intro to programming course speed limit is worth it.
I got to save plenty of time by opting out of most of the lectures, but the groups and projects gave you feedback if you started skipping too much (something I learned in the introductory maths course that I also first thought I could get away with not going to every lecture for) and forced you to read at least the main set books so you got a good idea of whether it was material you understood.
It's indeed easy to think you know more than you do, but at the same time, sometimes you do know exactly what you know - been in both situations.
Matt Damon as the protagonist of Good Will Hunting: "You wasted $150,000 on an education you coulda got for $1.50 in late fees at the public library."
That wasn't true before the pandemic but without in-person classes it is absolutely true.
By the time I started university, I'd been programming for 13 years, I'd done paid freelance development jobs, and written my first compiler, and I'd done more advanced stuff than the first several semesters worth of classes. I had gaps, and I filled them with the group work and books, but there was no value to me in the in-person lectures for the introductory computer science courses.
Yeah and you did pay some attention, got a sampler plate, makes sense.
Plus it's fun acing courses with no effort every once in a while. It's a good sign.
It was also not about enjoying acing courses, but about needing to take courses that were compulsory for the programme and that you could not test out of. As I said, the option to skip most lectures felt like a reasonable middle group - if I'd run into problems with the group sessions, I could have easily gone back to the lectures at any time.
The lecturer pre-generated small black & white square bitmaps of single characters from a sample set of fonts to use as aids during development. (Just the lower case letters a to m.) Then your mark was the percentage your OCR could recognise from a much larger set generated from about a thousand fonts.
In the same course the next major project was to make an AI for the card game Hearts. This is a four-player game, and the project materials included an automated tester that could be given any 4 AIs and would score them against each other. In the labs we would battle our AIs while developing them.
I ended up getting the second highest score out of a class of three hundred students and I still don't know how to play that game well. (I got the AI to teach itself the probability tables for optimal play, which I didn't memorise.)
He used a digital projector in an era where that was still rare in even computer science courses so that he could demonstrate the basics of the edit-build-debug cycle. He'd deliberately leave small errors in the code to "fix" and he'd get the class involved with suggestions on where to look and what to try.
All of his projects were competitive, because it got the students much more engaged if they were racing each other. I believe the year after mine had to play a monopoly-style game where trucks were going around a "game board" and could buy and sell stuff for profit, could run out of fuel, borrow money, etc...
Meanwhile all the other lecturers would drone on and scribble unreadable gibberish on a blackboard. We had one lecturer give us a final exam where half the marks depended on converting 7 lines of C to assembly, except that 7 lines had 5 errors in it. Two of the lines were just the braces, which means effectively every line was faulty.
CS is a totally different beast and I am glad about the humble experiences around CS. I might not totally agree with all the educators tell you, especially around OOP, however especially the mathematics around CS was impressive and very helpful.
I know many who took a similar route as me, but I've never met anyone who self learned math to a reasonable level. And since math is a very small part of a CS degree you could learn all of it in 1-2 semesters, so the optimal way to learn computer science would be to take 1-2 semesters of college math and spend the rest self learning. I bet you'd get a better understanding that way in much less time than it takes to go through a CS degree.
The other intro courses (eg computer architecture, which taught assembler) were great though, even if I found them easy due to prior knowledge.
Unfortunately that experiences doesn’t give a clear line for what to test out of and what not. I bet I could have passed the computer architecture one too, but I would have missed out, while the programming one would have been best if I used the time for something else (I mostly did, but there were lab sessions that were graded and couldn’t be easily skipped)