This course looks "fine"; however, I would recommend that anyone interested in exploring CS (or perhaps even if you are a self-taught and very able coder who wants to learn those missing fundamentals ) takes CS50 out of Harvard.
It is easily the most engaging course I have ever taken and it's available for free on edx.org or you can take the "real" class from Harvard extension for a couple grand. You can go into this class as an underwater basket weaver or a strong coder and get a ton out of it.
I think this Stanford course is aiming at a different goal than Harvard’s CS50. Harvard’s course seems to be aimed at people who are coders or want to be better at coding, so you learn about different languages, algorithms/data structures, SQL and such.
The Stanford course, especially the second half, appears to be more in the spirit of liberal arts. It covers high-level concepts in CS (server vs client, how does the internet work, what is encryption) that even someone who never writes code professionally will be able to use. They’ll be better able to read newspaper articles on tech topics, or perhaps more to the point, better equipped to be a PM/lawyer/BD in the tech space.
> Harvard’s course seems to be aimed at people who are coders or want to be better at coding, so you learn about different languages, algorithms/data structures, SQL and such.
Hard disagree on this one. I learned how to program from CS50 with no prior experience. That introduction got me interested enough to pursue it as a career. I would highly recommend it for anyone who just wants to see what the whole programming thing is all about.
I did not intend to suggest CS50 required coding experience. My comment was more that the goal of CS50 seems to be about making the student a better coder by the end (including the case where the student has no coding experience). That does not seem to be the goal of Stanford’s CS101.
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! :)
Strongly second CS50. I took it when first getting into tech, and it was a very solid starting point to build my CS foundation. I’ve heard from folks I’ve recommended it to that they’ve continued to iterate and improve the course as well.
I honestly don't understand why people keep recommending CS50. Maybe I'm just a slow learner, but I really think that if I had had to learn programming with that course, I would never have learned it - the learning curve is really steep, and it crams way too many languages into a very short amount of time, making you a jack of all trades and a master of none. I also don't understand the obsession of CS curricula to have people implement things like sorting algorithms by hand. This would've really put me off as a beginner.
> making you a jack of all trades and a master of none.
- it's not about learning a language
- I don't think it's crammed either - it covers a lot but everything is explained in a very accessible way from first principles
- if an introductory course was using only one language, you still wouldn't master the language
- being exposed to different ways to do the same thing is very valuable and very underrated for beginners imo because it teaches you to abstract over concepts - when you learn how to read a file, write a loop, sort an array in each one of C/Python/JS, you develop better understanding of the concept of reading/looping/sorting instead of thinking that the only way to do it is the way your first language does it; you begin to develop a sense of which concepts are language-specific and which ones carry over across languages. I think it's better if this understanding happens early instead of late.
> I really think that if I had had to learn programming with that course, I would never have learned it
This is one of the most common misconceptions in general with educational institutions and the general software engineering job market.
Programming is not Computer Science.
Computer science teaches you how computers work, concepts of how encryption works, concepts of security, concepts of memory management, and so forth. More recently computer programming has been added as a part of Computer Science degrees, but actually just a decade or so ago (when I was going through it), you could graduate with Computer Science degree without programming experience at all.
There is no doubt that learning computer science makes you a better programmer, but it is different and it is possible to be a good programmer without it.
Programming is one of the practical applications that benefit from strong computer science knowledge. Just like how taking a human anatomy course or a biology course doesn't train you to become a doctor. But it's pretty important knowledge needed for doctors to be good at their jobs (so much so that we don't let people practice medicine without it).
> Harvard’s course seems to be aimed at people who are coders or want to be better at coding, so you learn about different languages, algorithms/data structures, SQL and such.
CS50 is definitely somewhere between "comp sci course" and a "get coding quick" bootcamp.
I’ve never heard of one. I refuse to believe a self respecting CS program would let people through without taking some kind of computer organization/low level programming type class where you _at least_ program in some C.
this whole "low-level" thing and C-elitism is very off-putting to the smart folks like us--who are not stuck in the past and want to get on with the future. You don't need low level details to program well--you need a good language like APL, to truly learn how to program.
@l33t2328 programming IS the language and method of expression in computer science. I agree that pointers and mem alloc is necessary if you want to do research in CS and will continue to be so in the future, but as far as programming (post 2022) is concerned, I don't see why any sane person would want to "get down to bare metal", given the improvements in hardware and language design.
> making you a jack of all trades and a master of none
This is exactly the point of any introductory college level course. They're never intended to be the end of your education, they're designed to be a broad introduction to most of the different concepts that you will be learning throughout the program.
Even if you're not taking the rest of the program, having a broad overview as a starting point is valuable. You won't "master" anything in 3 months no matter what you do, so starting by going deep just needlessly limits your perspective on how much there is to learn.
CS50 is really good, and the instructor is real rockstar, not a shame to recommend it too. Guess many people expected a course like Codecademy with `print 'Programming is fun!'`.
I remember learning mergesort as a beginner was a really eye-opening experience. Going through the progression of sorting algorithms seems like a perfect way to showcase the power of algorithms- they are easy to implement and are used everywhere. It's easy to forget how magical recursive algorithms are to the uninitiated.
This is going too far in the other direction. There are absolutely people who have mastered e.g. Java, CPP or whatever with language-specific knowledge. Being an expert on JVM internals won't boil through to Haskell.
Well, being a master of JVM internals does give you a very strong grasp on a very useful basket of concepts for GC and programming language implementations, so I'm not sure I would necessarily agree that there's no transferable overlap. But regardless, neither of these are applicable metaphors for a 101 level CS class—at the introductory level, you're better getting a broader survey of lots of different languages, because learning the transferable fundamentals is more important than learning the specific "trivia" of any particular language.
JVM is essentially project knowledge, if you're writing code that requires you to understand JVM internals really well, unless you're working on JVM directly, something is wrong within the division of labor. Programming with java requires no internal JVM knowledge bare the bare minimal surface ones (execution args, etc).
My experience was the opposite. I went in with absolutely no programming experience. It took me a week to figure out how to do the first problem set (boy are loops ever amazing).
CS50 got me interested enough in programming to pursue it as a career. I have a CS degree now, and work at a well known tech company.
I don’t think the audience is “people who know some programming already.” It is designed for absolute beginners and assumes very little about your prior programming knowledge. I recommend it to any beginner looking to see what computer science is about.
Has it occurred to you that your dislike for it may be due to the fact that you're not the target audience, rather than that there's a problem with the course? In your previous comment (since deleted), you noted that you had been programming for a few years before you tried it. It's an introduction to the subject, so you were bound to find a lot of it to be beneath you.
In my own experience working with a lot of brand new programmers, making the subject entertaining is 80% of the battle. Most introductions to CS are unbearably dry and do a very very poor job of motivating further study. The job of an introductory course is to give an overview of what you'll learn going forward and make you want to learn those things, and by all accounts (even yours) CS50 does that.
It absolutely has occurred to me that I'm not the target audience. That said, I still think there's a problem with the course in as much as I don't agree with the method selected.
In other words, CS50 is probably great if it is the one and only course a new person would take. This is due to the broad focus on so many concepts.
However, if it is the first out of many courses, I would not choose such broad focus. I would (and have done many times) create a curriculum based on the student's needs and desires.
That's why I don't like CS50. It's not because I'm not the target audience necessarily, it's that CS50 is overhyped and, in my humble opinion, not suited to be the first course for serious self learners.
By not suited, I mean that there are a number of specifications on Coursera that are a) also free, and b) will lead one better to the goal if the goal is known (which is where most newbies need a mentor). I do not mean that CS50 is unsuitable; I mean that it is suboptimal. In my experience, that is.
Thanks for the substantive reply! It's good to get a different perspective.
I think you may be right about it being suboptimal for self learners. It was, after all, not really designed for that. I disagree that the breadth of the course is a flaw.
One major problem I consistently see with self-taught individuals (including myself before college) is that they have major blind spots, places where they don't know what they don't know. A broad introductory course that intentionally doesn't restrict itself to topics the student is already interested in is the best way I know to quickly turn those unknown unknowns into known unknowns. Whether or not the student chooses to fill those gaps in later with further courses, they'll be better for knowing where the gaps are.
For me, they teach the fundamental (basic) concepts and then have you cycle through a bunch of programming languages week to week to reinforce they are simply the tool and they all have their own pros and cons. When I took it, they had javascript, c, python, php, java, snap, integrating APIs and libs... maybe more.
The course has 2 tracks which are graded the same: "regular" for those new to cs/programming and "hacker" which has a bit more of a challenge to keep it interesting, and you just do whatever one you want to do that week.
Each assignment has additional optional material explaining and reinforcing the concept so if you are a little opaque in an area you can go and study that a bit more before returning to the assignment. Ultimately, there is a walkthrough for each week that gives you about 95%+ of the answer in case you get really stuck. If you understood the concept well enough from the lecture or your own background, you can just blast right through the assignment, or put your own spin on it.
Supposedly this course is responsible for hundreds (if not thousands) of people changing their planned field of study to be more technical due to the huge accessibility of the material to what they call "less comfortable" students.
They also teach you a few adjacent things that are relevant and probably wouldn't be covered by most modern programming courses.
They teach you how to use desktop VMs for your IDE.
They teach you how to use a basic IDE.
They teach you the basics of Linux command line.
They teach you what memory leaks are and how to find them.
You're graded on style, there is an automated style checker.
For me, I got a kick out of all the sorting algorithms and how it applied to big O notation and software complexity. Previously I understood roughly how it worked but the course went deep enough where I tried implementing some of them on my own "for fun" to see if I could do it.
For my final project, I built a native android app, and although they didn't teach anything specifically about mobile app design, I had enough confidence at that point to knock it out.
On top of all those items, production value of the course seemed huge, very well done.
CS50 is a good course but this one has a very useful discussion of open source and licensing issues related to various formats that CS50 seems to lack.
It is easily the most engaging course I have ever taken and it's available for free on edx.org or you can take the "real" class from Harvard extension for a couple grand. You can go into this class as an underwater basket weaver or a strong coder and get a ton out of it.