I’d recommend CS 61a/b/c from UC Berkeley. I think it’s available online as well. The reason I like these three courses is that they cover the three key aspects of computing — programming, data structures, and machine structures. I find that the last part is often left out because we “abstract” away low level features of computers, but learning even the basics of page tables, caches, instruction sets, timing, etc. is extremely critical to a complete understanding of what’s going on.
I was the most recent instructor of 61A and just wrote up tips on auditing it:
http://blog.pamelafox.org/2022/07/how-to-audit-cs61a.html
However, I don't recommend 61A for folks new to programming, it's better as a second course.
I took it when I was an undergrad (that was ten years ago, but I hope the spirit remains the same) as my first CS class. It was very tough given my preparation, but the thing I appreciated was that it gave a very general introduction to many high-level concepts in fairly good detail. I felt I had a solid starting point in many things- programming paradigms, understanding data abstractions, levels of abstraction in program design, etc that I don't always see replicated in other introductory material.
I took 61a under DeNero as a transfer with high school APCS and college intro class experience, since the dept didn't let me waive the scheme/lisp part. And I was shocked at difficulty, like "no way kids programming for the first time as freshmen can keep up with his course pace"
Hm I took it under someone else so I’m not sure what it’s like these days. Sad that it has such a reputation.. I was able to ace the course and transfer into EECS my freshman year, so things probably have gotten much harder in the last ten years.
I remember some kind of test to get into it (1997) which asked people to write a recursive function (I think it said something like "please write a recursive function in the programming language of your choice"). If you could do this, you could take CS 61A; otherwise, you were asked to take CS 3.
Alternative to the recursive function question, was also one testing mathematic induction (1999). I didn't know enough CS or Scheme to get into CS61A, but they were fine with getting the underlying concept in a language that was safer to assume people were familiar. (I wasn't lucky enough to have any CS or programming courses in high school unlike most of my classmates.)
Oh yeah, I think that was on the 1997 test too... I think it may have been something like "please write a recursive function in the language of your choice, or prove a property of integers by mathematical induction".
I don't remember if there were suggestions (like factorial for recursion or a summation formula for induction).
At that time it was taught by Brian Harvey. I liked him a ton. I know there have been other excellent 61A teachers, too.
Some students supposedly require weeks of instruction and/or practice in order to be able to use variable assignment!
If there's a kind of instruction that reliably teaches students as a whole to write recursive functions successfully in just an hour, that will be a great advance for computer science education.
@schoen: there is. the problem with traditional teaching methods is that they start from the ground up, without providing a motivation. I would be seriously worried about the state of a world whose denizens need a week or so to learn variable assignment! :)