Readit News logoReadit News
Posted by u/ggr2342 2 years ago
Tell HN: UC Berkeley's CS61A/B/C are the best courses to learn CS and coding
I have dabbled with many resources before in hope of learning to program and learn basics of CS. I have looked at intro course sequences of schools like MIT, CMU, Stanford, etc. Most have partial resources locked down. I have dabbled with books and they felt like shit. Even the book Think Python by Allen Downey was all over the place.

The books and blogs at least taught me basic syntax constructs like variables, function definition, loops, etc. But I couldn't understand how to package them up (compose) to use them in solving problems.

Then I started studying through Berkeley's 3 course intro CS61A, CS61B, CS61C. They have all materials in the open and if you are following the most current iteration of the course, they even post solutions to the problems. It was godsend for me.

Now, I am confident to learn more CS topics using courses from CMU, MIT, Berkeley, Stanford, etc. The thing that was holding me back was the lack of confidence of programming and understanding really what a program was doing.

mdorazio · 2 years ago
Going to hard disagree here and say this is extremely person-specific. I already knew how to code in C++ and Python from high school AP classes. CS61A was awful for me and made me hate computer science. I tested out of 61B. 61C taught me how computers actually work and simultaneously made me quit the major.

Here's my take: if you are interested in computer science, the combination of these classes is great. If you are interested in being a software developer or building things quickly to solve problems there are far better resources out there.

jedberg · 2 years ago
I would contend that you can't be great at being a software developer or building things quickly to solve problems if you don't understand the computer science taught in these courses.

You might be good, you might get some stuff done, but you won't be great.

I say this as someone who has been around this industry a while. You don't need a fancy degree from a fancy school, but you do need a solid basis in theory. Some of the best developers I know never went to college, but they did learn the theory on their own.

And some really poor developers did go to college, but their college didn't emphasize theory, and so they aren't very good when something happens just outside of what they learned, or a new problem presents itself.

baq · 2 years ago
Yeah it’s important to point out that programming is not software engineering is not computer science.

Computer science mostly requires a pencil and a piece of paper.

Programming is the act of making a computer do what you’ve written down on that paper.

Software engineering is figuring out what do you need the pencil for and once you’ve done it, making sure computers are doing what programmers think they told them to.

tenkabuto · 2 years ago
> Software engineering is figuring out what do you need the pencil for

Could you please elaborate on this? :)

bhl · 2 years ago
> CS61A was awful for me and made me hate computer science.

Valid criticism. Think for most students, 61A has too steep of a learning curve for an introductory class. For people without any programming experience, it’s a bit too much too fast and with a class size of 2000+, you struggle for resources.

For those with prior experience, it feels like unnecessary training wheels. You learn a little bit of Python, SQL, and Scheme. You have to do environment diagrams (What Would Python Do) on paper, and learn how to use a debugger. Projects and tests have mad-libs style fill in the skeleton code.

In my experience, 61A is a tasting menu of computer science: you take it for the experience, and leave hungry and confused – but excited.

> I tested out of 61B.

OP, you really missed a lot by testing out. This class is half theory, half learn by doing. For example, you learn about red-black trees or Dijkstra's in lecture and then go to lab and implement it.

I know theory and algorithms seem bland at first, but look at the applications. https://www.cs.princeton.edu/~wayne/kleinberg-tardos/

Favorite aspect of this class was designing and then writing a smaller version of git. You had to write a design spec that was checked off, and then your implementation had to pass a test suite.

If that’s not software development, then I don’t know what it is.

> 61C taught me how computers actually work and simultaneously made me quit the major.

61C was not one of my favorite classes because of how low level it is (compilers, RISC-V, concurrency, etc.). But if you stopped taking classes before upper division, you missed out on a whole gamut of “practical” classes like algorithms (CS170) and operating systems (CS162).

beeburrt · 2 years ago
> ...there are far better resources out there.

Such as?

Genuinely interested.

nextos · 2 years ago
I think HtDP is really good: https://htdp.org

It's beautiful like SICP, without being too difficult or technical.

It teaches one thing well, functional decomposition.

gojomo · 2 years ago
Given your testimony, I trust you that it's person-specific – especially since my experience at Berkeley, back in the CS60A-CS60C days (with Scheme) was almost diametrically opposite.

My 80s high school had no programming classes to speak of, but in my own tinkering, I'd done a lot of BASIC & Hypercard Hyperscript tinkering, & I'd looked over enough assembly & Pascal to get the gist. I felt, "I'm good at computers, I can learn what I need there on demand, I've got to major in college in other deeper subjects that I can mainly learn from those departments." And, "being a software developer" alone seemd too narrow an ambition - I thought I'd instead be "someone-good-at-software" in some other kind of innovative industry.

Still, I took CS60A because I didn't want whatever watered-down stuff they'd provide to non-majors – Pascal, I think, at the time. Within a week or 2, CS60A convinced me: there's more interesting depth to 'Computer Science' worth learning.

That continued through CS60B, and by the time I'd done CS60C & the combined EE intro theory & lab course – EE1(?) then, I think, unsure its current equivalent – I'd felt like a circle had been closed on my understanding of how it all works, from logic gates (which I'd understood since a 5th-grade science project & then "Rocky's Boots") through to high-level stack-based languages.

I was hooked, & then knew CS would be at least one thing I'd major in. I ultimately double-majored it with Economics.

Then once out in paid employment, I'd work with people with Bachelors or even Masters degrees from schools not quite-as-famous for their Computer Science programs, and those people would be missing basic knowledge & intuitions about algorithms, data-structures, & OSes that'd been well covered way back in the Berkeley CS60A/B/C intro series.

Of course, the depth of tools & experience available to kids through high school age is wildly different, & better, now. And, if your highest goal is professional training as a software developer, college itself (& college-style courses) may not be ideal, compared to just doing as much as you can, as fast as you can, in the most-challenging workplace that'll take you, filling in gaps with self-study as needed.

But if you want a high-quality college-style education in Computer Science, with the breadth & depth for lots of possibility-frontier work – not just the surface stuff evident to a younger or outside view – Berkeley's curriculum was an excellent eye-opener for me. For precocious students, it should probably replace any "Python & C++" coding in AP high school classes.

enjoylife · 2 years ago
> 61C taught me how computers actually work and simultaneously made me quit the major

I'm genuinely curious, why did the course make you quit? Was it the material or the professor, or something else entirely?

teleforce · 2 years ago
Not the guy you asked, but my guess is that they're are not interested in how and why the computer works [1].

They probably more interested on how the computers can work for them. These students most likely to work in the banking or finance sectors where the payments are good and bonuses are awesome. Don't got me wrong though, they are good students and engineers, but under-the-hood of computers are not their main interests or passions. For example, someone can become a car enthusiast but can't be bother to open the engine bonnet or pump the tires.

[1]CS 61C. Great Ideas of Computer Architecture (Machine Structures):

https://www2.eecs.berkeley.edu/Courses/CS61C/

golly_ned · 2 years ago
It sounds to me like the original poster is saying they're the best courses for them because all the resources are available and up-to-date rather than because the content is superior.
throwaway71271 · 2 years ago
One person's best learning resource is another person's nightmare.

We still have not understood how to tach coding. The subject seems to be completely non linear, and some people get stuck and cant move on and the teachers cant figure out why and they cant figure out why, it could last 1 month or could last 5 years, and at some point some random thing they read or watched completely unlocks them.

(For me the thing that helped me was Richard Buckland's Higher Computing lectures: https://www.youtube.com/watch?v=hE7l6Adoiiw&list=PL6B940F08B...)

The best way to learn is to keep trying and particularly trying to understand what you do not understand.

As Feynman said on his last board: What I can not create, I do not understand.

So if you are one of those people who is stuck, or you watch CS61A/B and it does not work for you, just keep looking and trying.

phlakaton · 2 years ago
I think I generally agree. A student getting stuck on something doesn't mean they're not learning. To the contrary, those can be some of the times the student learns the most.

In the case of them not "getting" pointers, for example, getting stuck might reveal they need to go back and solidify their understanding of the memory model, or how data is represented. These are good things to know you don't know!

Even getting stuck on yak shaving can pay dividends – having the student carefully compare their command to the instructions, learning what does and doesn't work, and patiently building experience with their tools. Even if they feel like they're doing nothing, they're probably learning.

So I think the major problem with self-study using online CS materials isn't people getting stuck per se... it's that those materials are no substitute for teachers and a cohort of learners. Some people do just fine without that support! Others do not.

throwaway71271 · 2 years ago
> To the contrary, those can be some of the times the student learns the most.

I agree, its like 'level up' in a video game :) but I think it is very hard to not despair when you are hitting your head against the wall for too long. If you check the learningprogramming[1] subreddit it is full of stories of people giving up.

It seems in programming, maybe because the pay is so high, the intersection between good teachers and good programmers is not very high.

I read a some of papers investigating `how to teach mastery` and was comparing tutors vs tools, and the very best results were from tutors + tools (sorry I tried to find links in my history but couldnt). Tutors beat tools, Tools beat not getting any help, but even the best tools were not substitute for a teacher.

Maybe now with chatgpt the tooling will greatly improve, for example having an random error most kids just give up and wait for next lesson to ask a question, but now they can just past it in chatgpt, and most importantly they can ask chatgpt the stupidest and most embarrassing questions that they would never ask in class, or to their teacher.

[1]: https://www.reddit.com/r/learnprogramming/

Deleted Comment

x1f604 · 2 years ago
> The subject seems to be completely non linear

Is this not the nature of learning in general? Why is it supposed that learning things in the linear A-B-C-D fashion is even possible for most humans, rather than supposing that most people would need to revisit certain topics before learning new topics, e.g. A-B-A-D-C instead of A-B-C-D?

throwaway71271 · 2 years ago
By linear I did not mean the order in which you study, but rather how your understanding builds up, as in, how much time you put in, and how much you grow.

For example if your native language is subject verb object (cows eat grass) it is quite linear to learn subject object verb (cows grass eat) languages (e.g. Japanese), you put in time, and you make progress. There are other subjects where when you get stuck you cant move on, and the pedagogy and androgogy systems we have came up with for math/physics and etc are getting better and better to understand what people don't understand and how to move them further. Which on its own is quite problematic when you have a class of 30 kids and you are moving with the 'average' kid which does not exist.

In the same time, programming is fairly new, and teaching it is still evolving, educators still disagree on what is important and in which order (reminds me a bit of this Feynman video about 'Greek' versus 'Babylonian' mathematics https://www.youtube.com/watch?v=YaUlqXRPMmY)

There was a great example someone used, the amount of people who get confused by the equal sign, and some actually never go through understanding references and values for many years:

    x=5 
    y=x
    x=6 
    print(y)
and

    a=[] 
    b=a
    a.push(1)
    print(b)
Now I am teaching my daughter and I spent about 3 days per week just on pointers and strings (We even made a card game we play from time to time https://punkx.org/c-pointer-game/), and I can see when she is stuck and what exactly she is stuck on, but how can you do that with 30 kids, when the most subtle nuance in the questions they ask can give you the deepest hint in what they are missing?

brightball · 2 years ago
I still remember how confused I was in my 101 course at Clemson. I was certain I was going to have to change my major.

Then one night on a project I was just staring at the code at 3am…and it suddenly all made sense. Got A’s in all my CPSC courses after that too.

_xivi · 2 years ago
> We still have not understood how to tach coding. The subject seems to be completely non linear, and some people get stuck and cant move on

The same can be said about any subject or skill.

If you go to any class, you'll find some people are interested, others aren't. No matter the subject, be it sport, physics, math, chemistry, art, history, etc. Same teacher, same material, different reaction from students.

There's no artificial "ceiling" at play that's specific to coding.

throwaway71271 · 2 years ago
I think the problem with coding is that people who are very interested still get stuck, I suspect this happens less often with people interested in chemistry/math etc. (possibly because of survivor bias because people drop out of it sooner, because there is no money in it)

There are countless reports of people 'not getting it' after studying for 4 years, they cant make fizzbuzz, and I dont mean they dont get some nuance of it, they literally cant even start typing.

I dont think there is artificial "ceiling" to coding, I think we still have to learn how to teach it, and particularly how to teach it to a mass of people.

meroes · 2 years ago
It’s so true and refreshing to hear. If I had to characterize my own successes in learning, they come from very “honest” teachers, and those aren’t always in intro courses. A few examples, learning PowerShell from Snover, one of the creators via Microsoft Virtual Academy (probably a bit dated by now) or Calculus 3 from Professor Leonard on YouTube. I often have to go through a few dozen resources to find the one that works for me.

We also can’t teach math well for the masses, there’s a long history of failure. Like New Math or the STEM pipeline. Embarrassing stuff really and I don’t know what a good solution is. It’s one reason I don’t totally hate the new approaches to how math is taught that get lambasted on social media (this is not New Math which was much earlier) because the past isn’t working well enough.

noufalibrahim · 2 years ago
Good point but I'd go further. When you're stuck and start to struggle and sustain through that, that's where real learning happens.
sgloutnikov · 2 years ago
Ryoung27 · 2 years ago
People like you are the best type of people out there.

Deleted Comment

pamelafox · 2 years ago
I was a CS61A lecturer for 3 semesters. I thought that we covered very valuable content, but also did not think that it was appropriate for new programmers. I encouraged students to enroll in a true intro class, like CS10, before embarking on the 61A journey.

Here’s my post about how to audit 61A : http://blog.pamelafox.org/2022/07/how-to-audit-cs61a.html?m=...

fdye · 2 years ago
Took CS61AL (Lab version) about a decade ago. Even knowing how to program and working in industry for several years it was not easy. I think my class was one of the last to use Scheme before they switched towards Python and was entirely taught with SICP Book. Probably the biggest difference between sort of traditional programming courses and CS61AL is you have to essentially understand and do recursion day one. It sort of blew my mind compared to the way I learned because generally you do simple statement programs, then functions, then for, while, do while, etc. Then finally around maybe chapter 10 in a traditional book you get to recursion. CS61AL, SICP, and its lots are great, but they very quickly touch on discrete math and calculus concepts and how they relate to programming/CS. Ditto for first-class functions and Lambda's, all introduced very soon in CS61A. Great course though, was a serious challenge from something I thought I would skate through. Definitely made me a better programmer.
trelliscoded · 2 years ago
CS61A in particular is important for understanding the nuts and bolts of how programming works. The people who tended to do well in the course had little prior exposure to specific programming languages outside the prerequisite class. I think that all the abstraction that other programming languages do get in the way of understanding why the languages made some of those design choices, which is why throwing all the abstraction out the window is important to understand what's really going on.

I'm reminded of an experiment I was told to do when I was learning how to be a better cook, and I complained that I didn't understand what bay leaf was adding to a dish. Someone suggested cooking some plain white rice with some bay leaf, and I could finally taste the peppery notes it added. Sometimes you need a neutral substrate to see the details of the thing you're trying to learn.

gnulinux · 2 years ago
Before coming to college I had tons of programming experience and two interships. I wrote websites, backends, real life applications shipped to customers, school club websites, I even taught C++ in my high school's IEEE chapter. CS 61A completely changed my perspective on how to think about code, I found it so valuable that I could graduate just with 61A, study everything else (algorithms, data structures etc) myself and be fine with it (this is likely an exaggeration of course, there is some value to finishing a traditional CS curriculum).
flappyeagle · 2 years ago
I learned nothing in 61A — because I was a dumbass kid and didn’t take it seriously.

61B made me feel like I knew how to program.

61C taught me how computers work.

A decade or so later 61A is actually the most useful of the 3 courses now that I’m mid career.

I might recommend that you take 61b first before the other 2 if you’re just starting out

golly_ned · 2 years ago
Agreed on 61A. I took it when it was still just SICP in scheme. I saw much of the rest of the curriculum as a variation on the themes I learned in 61A.
Cjcrew · 2 years ago