272 comments

[ 2.9 ms ] story [ 284 ms ] thread
not op, but i think it's good enough to warrant reposts so new people can find it.
‘dang is saying “see also”, not “this doesn’t need reposting.” From what I’ve seen, reposts after a year or so are fine.
Also past comments are sometimes better (and other times not) than average. Just depends on who chimes in and their mood and what else is happening in their world at the moment.
As grzm and brudgers pointed out, the goal of such comments is simply to point curious readers to related threads they may find interesting. If there were a problem with the repost we'd mark it a dupe instead. Reposts are fine on HN after a year or so, or if a story hasn't had significant attention yet. This is in the FAQ: https://news.ycombinator.com/item?id=23150065.

I've been looking for a brief, unambiguous phrase that can point people to related threads without having to spell all this out every time. A reader suggested "See also" which seemed like it would hit the spot: https://news.ycombinator.com/item?id=23150065. I guess not!

Hmm, "see also" strikes me as pretty unambiguous phrasing.

I wonder if the problem is that when people are skimming, they're going to to miss a pair of short words in favor of the larger URLs (and by "larger" I mean the physical space the text occupies on screen). A bunch of links to the same post will always seem damning if you don't know better.

> Note: this guide was extensively updated in May 2020.

Prior discussion may not be exactly relevant on some points.

I like Algorithms by Robert Sedgewick. It's a great book. He also has free online courses based on the books that are of excellent quality:

- https://www.coursera.org/learn/algorithms-part1

- https://www.coursera.org/learn/algorithms-part2

There's a website for the book as well, that has code that is well organized and commented.

Unfortunately excellent books like "Programming Pearls" have code examples that use weird naming conventions that just make me just want to punch the wall.

For competitive programming and interviews, Antti Laaksonen's books are fantastic: https://www.cses.fi/book/index.php

I’ve heard that Part 1 of the algorithms course is sufficient for new grad interviews. Can you verify?
I got an interview that involved part 2 (substring search), which I solved using KMP.
senior interview or new grad?
Phone interview for a senior role, not onsite.
> I’ve heard that Part 1 of the algorithms course is sufficient for new grad interviews
It sounds like you got hazed.

I still don’t understand why these software interviews do this. Especially when the work in question, is derivative, and mostly just reformulating other ideas and libraries.

It’s like, how often are you going to have to reinvent your own Red Black Binary Search Tree to solve some obscure business problem? Most of the time, the business doesn’t give a damn. Just throw your data into a database, and be done with it. Then use some queries to filter through your data, and get the data you need to solve the problem at hand.

And usually, by looking at someone’s code style, you know how good they really are. You can determine, if (1) they are at a hackerish level and their code has bugs and occasionally breaks, or (2) if their code is really solid software engineering level quality that’s airtight and can survive anything you throw at it.

I prefer these interviews rather than take-home projects, which usually take longer and can be cheated.

A company once sent me a really long take home exercise that took like 3 full days to implement to completion. I said: no thanks, and in the same 3 days I had multiple interviews and even got an offer.

Looks like a decent start, great to put these various sources together. Under algorithms, I found discussions of big o time complexity, one of the real killers for the non-cs majors in terms of interviews and career growth. Under algorithms I found it on the Coursera course by "Tim Roughgarden ... available on Coursera and elsewhere".
As a 30 year old software developer who's now considering going back to school for the next 3-4 years to get a degree, I wonder if I should blame these kinds of resources for making me believe that I could learn everything on my own and that a degree was unnecessary. Having learned this material in school would have made my life so much easier...

For context, I recently received a lot of pressure to get a degree, despite years of experience and good knowledge of CS fundamentals.

Where is the pressure coming from? Your employer? I’d guess it varies widely between companies.
The pressure comes from everywhere:

- Current employer: "Your salary is already good for someone without a bachelor's degree"

- Current employer: "We're sorry but this promotion requires a bachelor's degree"

- Future employer: "We're sorry but we hired someone with a bachelor's degree for this job"

- Date: "You don't have a bachelor's degree?"

- Friends: "You're the only one without a bachelor's degree"

- Meetup: "What did you study in college?"

- Country: "We can't grant you a work visa without a bachelor's degree"

- Family: "You will have more opportunities with a bachelor's degree. We'll even pay for it." (offer expired)

- School: "Here's a scholarship" (offer expired)

- 80,000 hours: "You basically don't exist"

- Brain: "Maybe I'm not a superstar coder and job security is important"

Perhaps some of these are hypothetical, but they feel the same as if they had been concretized.

does similar pressure exist for a Master’s Degree? I’ve considered OMSCS for this reason.
Ask me after I get my bachelor's degree.

I suspect the pressure never really goes away.

I have a hard time believing that an employer ever cared about my degree in CS from 24 years ago from a no name state college when they decided to hire me.

I’m sure my classes in COBOL,FORTRAN, and data structures in Pascal made any difference. Well, I did take a course in C and 16 bit x86 assembly.

It was different times back then I'd argue, you could basically do 5+5 in a shell and get hired and shipped of to New York, but they where also forced to be constrained enough by the hardware to become clever after getting the job.

2018 Apple had 20 million registered developers and it has only increased since then.

It's still very easy to become a developer right now (sambo found it to be the easiest path forward for example, from no experience at all), but the trend is quite scary. I have frankly no idea how it look when I turn 60.

I’m saying once you have experience even now, as the original poster has, most companies don’t care if you have experience.

In the immortal words of every in r/cscareerquestions “learn leetCode and work for a FAANG”. No I didn’t do that to “get into a FAANG” but it is a much easier route than the one I took.

If you want to go the enterprise route, if you have experience and do enough resume driven development and can answer basic techno trivia on a company’s chosen stack, it’s even easier.

Perhaps Western Governors University could be a good fit. https://www.wgu.edu/online-it-degrees/computer-science.html

The philosophy of WGU is that you pass self-paced courses by passing tests, so people that already know the material can complete the courses quickly.

I wish I had known about them years agob. I have applied last week, but I'm still waiting for their decision (they don't officially accept international students).
I'm doing that right now at 32, but more for personal enrichment than anyone pressuring me.

I feel like I'm getting much more out of my degree than I would have if I went the traditional route because I understand the context for the material, and because I've seen much of it before through self teaching, so I can focus more on consolidating my knowledge of the fundamentals rather than struggling to absorb all of these hard and often poorly justified concepts for an exam.

> despite years of experience and good knowledge of CS fundamentals

Have you considered majoring in something other than CS? If you're adequately self-taught and need the degree, then might as well learn something new and useful.

This is what I'm considering. I'm relatively content having been programming long enough. If I go back to school it probably won't be CS.

On the flip side, unfortunately CS is one of the few useful degrees that's had enough schools create a worker-friendly program (i.e. online) so many other degrees probable mean dropping out of the workforce.

Don't quit working to get a degree, and don't take on a lot of debt to get one.
Unfortunately the way the US education system is designed I don't have much of a choice atm.
I have considered the idea, but I don't know if the additional effort would be worth the possibly marginal benefits.

I've considered biology and law because they seem to pair well with software. Perhaps smaller niches would be even better.

was a Bachelor’s in a quantitative subject not sufficient?
Georgia Tech has an online MS in CS or Cybersecurity. The CS degree is a little cheaper, classes are roughly $650 each, cyber are around $900. You're looking at around $7k or $12k for the entire degree. I'm currently in the Cybersecurity program if you have any questions.

https://omscs.gatech.edu/ https://pe.gatech.edu/degrees/cybersecurity

Another option is NYU's Cyberfellow's MS for cybersecurity. It's around $16k https://engineering.nyu.edu/academics/programs/cybersecurity...

Main updates as of May 2020:

Computer Architecture: added Computer Systems: A Programmer's Perspective as first recommendation over nand2tetris.

Compilers: Crafting Interpreters added as first recommendation over dragon book.

Distributed Systems: added Designing Data-Intensive Applications as first recommendation over Distributed Systems.

Online availability of some video lectures has changed as well.

My school actually use the same book for Computer Systems (similar to CMU's 15-213) but less intensive. I wonder what parts the 400-level course use for Computer Architecture.
Harvard also uses the CS:APP for their first systems course, CS61.
CS:APP is recommendation over Computer organization and design.
Whenever i have someone ask me where to get started on CS - i give them a few options tiered to try and ensure some stickiness/higher utility for them specifically.

~Some Existing Touch Point With CS

Teachyourselfcs.com is definitely in the conversation - in general I recommend it to friends who have a pre-existing "gateway" to the field (software engineer or otherwise). The page talks about progressing from "type 2" to "type 1" software engineer - a deeper understanding affording a richer career/experience.

~Relatively Fresh - but have strong intent

For people who are more "virgin" and fresh but are willing to put in the work - I recommend OSSU ("open source curriculum") - and i've found for whatever reason that structure has let them gradient in with more success. (https://github.com/ossu/computer-science)

~Intrigued/Engaged - but intent is still nascent

For people who have a fleeting interest but don't necessarily have the time or intensity about their interest i usually recommend a starter python course - 90% of these people will fall off the path unless there is a more permeable access-point to the space that offers a positive feedback loop. The university of Michigan has some engaging options.

I remember telling people to read "The Python Tutorial" on python.org , if they wanted to write Python. It takes a few hours for an experienced programer, and a couple of days for a beginner. People had difficulty starting.
A beginner might have trouble assimilating this information - too few examples, not enough entry level drilling on data types, operators, flow control and functions. For example they might forget to put quotes around a string or not know how to use two for loops, one inside the other, even if they know how to use one in isolation. It's hard to grok how to compose things even if the student saw how to use them in isolation. And for the teacher, it's hard to keep the lessons easy enough at that entry level.
Quotes to indicate strings have been a problem, definitely. It's odd because it's so clear for me. Yes, I was lucky to dabble in all this a lot when I was younger.
When I started programming (with Python) I remember how the modulo operator was introduced, without any further information. I found it quite confusing, since I didn't know what modulo meant (that could be solved with googling) but more important, how it was useful. When you come from a CS perspective, it's completly clear on how you can use it and why it is essential for some computing tasks, but for a non-CS beginner that can be much more obscure.
Interesting perspective! And it seems connecting the dots is part of the role of an educator!
>For example they might forget to put quotes around a string

I wonder whether a "richer" editor/IDE, that flags such things immediately upon writing them, could greatly improve the learning experience.

Many tools even point out things such as non-existing variables in scope, which are not strictly "errors" in a dynamic language during edit time.

I would assume so. Using Intellij Idea helped me a lot, rather than using Netbeans that our professor insisted on.Netbeans has a really slow autocomplete and would slow me down a lot, however Intelllij's autocomplete would pop immediately and would learn from my usage.
> not enough entry level drilling on data types [..] they might forget to put quotes around a string

Just want to emphasize that first part; I've seen the second in new hires who passed a coding bootcamp, and it's really weird to watch. One of them even had to see the error message and go back to the code and still puzzle over it for several seconds before realizing what was wrong.

I strongly recommend OSSU! Both books and MOOCs have their place, and sometimes a MOOC is easier to stay motivated, provided a schedule, and exercises of appropriate number and difficulty.

I really like reading books too, but sometimes the completion-ist part of me is too strong and I shouldn't really do all the exercises.

In comparison with teachyourselfcs OSSU looks lame, serious. Structured badly, tons of links & strange YouTube channels. TYCS has chapters and 2-3 best resources about, ideal for this case.

For beginners I highly recommend Harvard CS50, the best of the best course available for free and paid too.

It's remarkable how the course goes from zero to several complete projects in different domains and technologies in just a few weeks. CS50 is a real stepping stone.
I agree that there seem to be a variety of links, but most of the courses linked there are of very high quality and I don't seem to see the "YouTube channels" that you're referring to. One thing I was unsatisfied with with TYCS is how it lists Crafting Compilers for the compilers/PL section of the curriculum. I would argue that more important than the specifics about compilers is a high-level understanding of various ideas in programming language design, and be able to understand the building blocks of different languages and compare the trade-offs of using one language compared with another. Of course, if you go through SICP as an entry point to computing, as suggested in TYCS, then you might be somewhat better off, but it's still not the same as a dedicated course on PL itself.

Dan Grossman from the University of Washington has an excellent course Programming Languages on Coursera: https://www.coursera.org/learn/programming-languages/, which I think would be far more relevant to modern programmers than studying compilers specifically. And I'm glad to see this course listed under the "Core Programming" section of OSSU.

I'd never heard of OSSU, thanks. The maths courses linked in that are good, too.
The OSSU curriculum has a nice selection of textbooks.

However, I am concerned with the fact that these curated lists lack a unifying idea of what CS is.

If you go to pure math instead, the consensus is clear. A pure math bootcamp, like Math 55, is mostly linear algebra and real analysis, taught from Axler and Rudin in its current iteration.

Simpler math curriculums progress more slowly, or use easier textbooks, but the idea remains the same: Linear algebra and real analysis.

What is the equivalent distilled core of CS? It can't be so many things. There must be a core which you build upon by stacking other courses and textbooks.

My take on this is logic and computation. They are the algebra and calculus of CS, and they are intimately related by the Curry-Howard isomorphism. I find it alarming that CS students are often not taught basics of propositional logic, first-order predicate logic or lambda calculus. It's the basics, and it is really useful.

Software Foundations [1] implements a nice curriculum in line with the ideas I have written about, but it is aimed at graduates and consequently it lacks background. I am still thinking about combinations of textbooks for undergrads that would offer something equivalent. Any suggestions welcome.

[1] https://softwarefoundations.cis.upenn.edu/

Were I to suggest two things to read/watch it would be Nand2Tetris and The Little Schemer. They not only teach the theory but teach you to apply the theory, and the movement of theory to application is crucial to me when discussing computing, an applied science.

N2T teaches digital logic, what Turning saw, how it was physically implemented and how programming languages were and are developed. TLS introduced various topics like the halting problem in an effective and playful manner. Both spark interest, something I find some maths courses fail to do in many people unfortunately.

This "Software Foundations" series feels to me like a focused exploration on PL. I totally agree that a solid grasp on PL theories is actually one of the most helpful things you could do to become a better programmer, and the MOOC by Dan Grossman from the University of Washington is amazing on this. But I'm not sure if this is exactly the same as learning "logic and computation".
+1 for recommending OSSU. The courses listed there seem to mostly be of very high quality, and I'm glad to see the two courses listed under the "Core Programming" section are the two that are among the best I've ever seen. The course Programming Languages by Dan Grossman is definitely much more helpful and insightful in the area of PL than the "Crafting Compilers" book listed in TYCS.
I am planning on returning to university for a CS PhD after discovering that studying this curriculum is consistently the highlight of my day. Studying CS is the most interesting thing I do on a regular basis. I owe my thanks to the authors.
what topic would you be pursuing for rnd?
What field are you going into?
I'm self-taught too, and strictly interested in research-focused CS masters or PhD programs (as opposed to industry-focused cash-cows). I think I'm mostly interested in studying PL or program synthesis, but I'm also open to other ideas. How did you make that jump from self-taught to qualified for a PhD program?
I made this exact jump. The answer, for me, was a four year bachelor's degree.

I was a self-taught software engineer, not a self-taught computer scientist. I was writing production code for fairly normal stuff, not proving theorems or implementing research prototypes of new ideas. So YMMV.

If you can make it through TAPL or PFPL on your own, then you probably know enough to be useful to some random grad student somewhere. Latch onto an implementation effort, get authorship on a popl/splash/pldi paper or two, and that's probably enough to convince some faculty somewhere to take a chance on you.

But most good graduate programs still require a regionally accredited degree. Getting an exception to that rule will likely require a publication record. (Getting into good graduate programs often requires a publication record in any case. I recommend against attending not-good graduate programs.)

(comment deleted)
I'm almost halfway through this: https://plfa.github.io/

I was auditing a grad class at UT that used this book, then corona hit. Still plan to finish it eventually though

I'm not even really sure where I would get started working on an implementation or working on a paper. Are these projects open source?

I would like to add this related question to the discussion: what resources/courses/learning techniques do you and others like you who have had an undergraduate Computer Science degree for a few years and are interested in academia but not sure what steps to take next use to continue your study? At some point I would also like to return for a PhD or Master's degree and I would like to keep myself mentally trained, but there are so few resources for higher-level study. All of the online resources I've tried are almost exclusively introductory and don't provide the challenge I crave.

Does anyone taken higher-level courses at a local university in their free time just for the experience and to be surrounded by like-minded individuals while having a professional career?

I wonder if anyone here has tried this (or other) self taught CS successfully while not being a "self-taught engineer or bootcamp grad".

What if you are a designer or PM type with several years experience in software industry? Is it productive to skip real experience or actual classes to get into CS/engineering?

You could certainly try to start learning to code with SICP and go from there, but for the most part these resources will be much more valuable to those who have some prior background in programming.
SICP sounds like a big waste of time when you can follow another guide in a language like Python and make applications along the way.
Yeah! Yeah! I'd say your onto something here buddy!
Agree/disagree, but after doing SICP myself, following other methods and making projects at the same time (or working on things I was interested in) forced me to learn a lot more than just doing some assignments in a language I would never use again.
I'm a PM turned programmer, I did both.

I started with Harvard's CS50 and web programming in Node independently, and I ended up with a masters in software engineering and can now push production-ready code (mostly in React/Node by choice, although studying university-level classes has exposed me to different paradigms and languages: C, Java, OCaml...)

I whole-heartedly recommend concurrently studying first principles and a couple of applied technologies. They serve different purposes but are ultimately connected in the big picture. University courses very rarely teach how to make real-life projects. Conversely, learning real-life technologies rarely shows you the theoretical principles that fuel them, at least not explicitly. React/Redux for example have really interesting ideas on managing state drawn from functional programming. To churn out React code, you certainly don't need an FP course or formally studying the pains of managing state in programs, but I found it to be immensely helpful. Same with many other areas: studying systems and networking will help you with many back-end technologies, compilers can help you understand many different programming languages, etc.

I don't think there's a program that teaches both, because it's probably impractical to design it. Simply pick one theoretical route like Teach Yourself CS and a couple of applied technologies, and work on them simultaneously.

Has anyone ever found a guide of similar format and quality for data science? I would love to find a similar collection of resources for learning data science fundamentals (math, statistics, programming, etc.)
Shouldn't the Math for CS come before the Algo book?
In most programs, you take 1-2 programming classes before taking DS/Algs. There really isn't much of a prereq other than 1 year of programming classes.
> If you’re a self-taught engineer or bootcamp grad, you owe it to yourself to learn computer science.

No, you don't.

I know all these topics and I don't recommend anyone working in a corporate environment to learn any of this. It'll likely result in you resenting your job, your peers and the entire software industry.

---

I gave my heart to know wisdom, and to know madness and folly: I perceived that this also is vexation of spirit. For in much wisdom is much grief: and he that increaseth knowledge increaseth sorrow.

1:16-18; King James Version

What does it say about our industry if learning all this makes workers hate what they do ? By this logic we should cut down on advanced education so people stay content in dull jobs.
I've included a Biblical quote concerning this matter to point out that this is an old human problem, not merely an industry problem.

> By this logic we should cut down on advanced education so people stay content in dull jobs.

This would indeed be the case, if corporate jobs were an inescapable necessity.

Isn't reduced education a method for keeping people content in most situations?
(comment deleted)
That's just FUD.

Recommending ignorance while quoting religious text is so over the top that it makes me wonder if you're just trolling.

You made a contradiction and then gave an irrelevant reason behind.
That biblical argument is pretty much the rationale for the events that take place in Farenheit 451 and the reason for the Great Firewall.
If you're a self-taught engineer without computer science knowledge, you'll find that you simply cannot work on the lower parts of the stack. Fine for you, perhaps, but it's not wise to limit your own career possibilities.
> It'll likely result in you resenting your job, your peers and the entire software industry.

Jokes on you I resent my job and the industry already.

Ignorance is bliss!

The biggest fish in the pond doesn't need to know there's an ocean next door.

Has anyone here learned a subject by going through one of these "teach yourself" lists? I've learned most of what I know about computers on my own, but it wasn't from following a list of textbooks. And when I've tried to follow a course like this for other subjects, despite my initial interest, I've found myself unable to make it through more than a couple chapters of the first textbook before running out of steam.

But somebody must be getting some value out of these things, right? Am I just bad at studying? Or not as interested in the subjects I'm trying to learn about as I think I am?

I graduated with a degree in BioSciences a few years ago, and elected to not do grad school like my peers. I saw no point of losing thousands of dollars to do a master’s in Bioinformatics/Data just to get a jr level job. That summer after graduation from undergrad I attempted to learn CS and go through OSS Computer Science program and TeachYourSelfCS to break into the industry. The problem was a lot of it wasn’t job relevant and it felt very rigid, and sometimes even more complex than it needed to be. These University level courses aren’t really necessary. I like to view coding as a trade and skill, something that can be learned and applied right away rather than a mechanism for research, feel free to disagree with me. In any case, I just wanted to code and build software (sorry CS purists...). I slowly found myself less interested in CS theory and more in software engineering. Feeling disenchanted with CS, I decided to spend a few months learning web and software development fundamentals through online courses on Udemy and Frontend Masters. After that I did a certificate in fullstack development at my alma matter (cost me a couple thousand dollars, much cheaper than grad school). I will say I was pretty lucky that as soon as I finished the full stack program, I was hired by a small software shop.
I think that CS vs SWE thing happens with a lot of people, and I got caught there, too. Luckily, I ended up really liking CS and it introduced me to the field, whereas otherwise I would've gone for SWE. There really needs to be a 'teachYourselfSWE' for people who are into that.
How can you tell which one is right for you? So many computer scientist graduates I know ended up pursuing software engineering that I've mistakingly conflated the two.
it's really theory (CS) vs building things (SWE). As you want to build larger projects, or build them better, you rely on CS ideas to do that. So SWE is really engineering assisted by applied CS. I've been studying CS for about two years and am only now learning any real application development. You can study CS without ever touching a computer or building an application (though doing both those things will give you context for why CS topics matter).

It's kinda like if you want to build a rocket to get to space, you can tinker with propellant, metal, and fire, and be a hobbyist that eventually you build a rocket to go to space. Or you can be a physicist and calculate everything on paper. To get to space you really need both those people, but the physicist can learn to build and the engineer can learn theory.

> but the physicist can learn to build and the engineer can learn theory.

So is this why frameworks exist? To abstract away the theory that proves something more "performant" or "sufficient", and allow the builder to do their thing?

More or less yes. The idea is that a framework (ideally) does some feature A the "right" way and programmers using the framework gain the benefits of convenience and safety, often at the cost of flexibility. Frameworks will usually try and balance the power or depth of the domain its abstracting with ease of use.

A good framework will stop beginners from making critical mistakes, decrease the amount of code its users have to write, and offer professionals well-constructed ways around its handholding as needed.

> The problem was a lot of it wasn’t job relevant and it felt very rigid, and sometimes even more complex than it needed to be.

CS was born out of a time when computers were very limited. How do you write a word processor with a spell checker, when the dictionary alone won't fit on a floppy disk, or fit in memory?[1] How do you draw rounded rectangles on your GUI when they take too many CPU cycles to draw?[2]

CS people managed to carve out paths through problem spaces that could be done on the computers of the day. These days, you put everything you need into a hashtable and it looks up in microseconds and you don't have to care anymore.

[1] https://prog21.dadgum.com/29.html

[2] https://www.folklore.org/StoryView.py?story=Round_Rects_Are_...

Interesting. I believe much of CS is practical now, and much is forward-facing and not relevant yet.
Curious to know: do you feel that you are at any disadvantage to peers who came to your role who went through a traditional CS or computer engineering undergrad program?
On the job, not really. Plenty of resources online that allow me to commit to continuous learning.
If your aim is to do some less demanding programming, e.g. using a framework without fully understanding how things all work together, then focusing more on practical projects could definitely help. However, this dichotomy between "CS" and "SWE" is a very dangerous idea. Once you have a solid grounding in CS, the software you write will be of much higher quality, you'll ship code faster, and you'll avoid many mistakes since you have a clear idea of what you're doing instead of just trying to blindly copy recipes.

Particularly helpful I would say is a solid idea in programming language theory and I can't recommend the MOOC by Dan Grossman from the University of Washington highly enough. As he said, even if you never get to program in the languages used throughout the course, you will become a much better programmer after finishing the course.

I just finished the distributed systems section of teachyourselfcs and I now have a solid understanding of a lot of concepts I previously only shallowly understood.

When I started learning, the recommended textbook was Distributed systems: Principles and Paradigms (the new recommendation is Designing Data-Intensive Applications) and the recommended course was MIT 6.824.

6.824 is the first online course that I have completed fully and it was well worth it. I read, took notes, and summarized all required course readings (around 20 papers) and completed the labs, which involved creating a raft-based key-value store. The labs were especially useful because they forced me to really understand the details of the topics I had learned (e.g., MapReduce, Raft, Raft’s log compaction) in order for my code to pass all the tests.

I’m very happy with the results of following the course and I now plan to put the same amount of effort into other topics.

How long did it take you to complete it on your own, including the exercises?
For the course I would estimate 120-180 hours spread over 6 weeks.

I read the textbook over a couple of months, but I couldn't give you a good estimate in hours.

Thank you, that sounds very reasonable!
I think these should be used more as a guide and dependency graph of study subjects rather than a rigid schedule. So, instead of going from first textbook until the last, maybe you just look at what interests you the most in the list and then check if you have the necessary prerequisites.

I plan to eventually complete most of the materials, but I take huge, sometimes multi-year detours. I've done SICP and nand2tetris books, it took around a year each (not fulltime obviously, also I went a bit harder on 2nd half of the nand like writing unit tests and building AST for the compiler instead of the easier approach suggested in the book). Then I decided I wanted to go do OS, but before that to learn C to be able to implement my own stuff, so I also worked through K&R book.

On the other hand I'm pretty bad at doing "real world" things, full of edge cases and details, and try to avoid them as much as possible, so I may not be an example of someone getting value in a practical sense. I feel that I've grown better as a programmer but I can't say how much of it can be attributed to my home studies and how much just to the experience on the job itself.

Having learned programming on my own and after spending some time doing it at work, I can now look at these books and say: Ok, these do make sense now and it's engaging to read them whilst a few years ago it was all too abstract and felt 'somewhere out there'.
When I learn something to the point I can consider it 'learned' it is never from one source or one guide. It's information taken at the relevant time in my learning journey from any search.
Not computer science but I learned a lot by going through Teach Yourself Logic[1]. I did not know where to start and how one subject relates to other and this guide helped me a lot. I have followed the guide for two years now and wish for some thing like this for every topic.

[1]: https://www.logicmatters.net/tyl/

I have used similar lists to go from almost entirely self taught to having finished a half dozen CS and FP courses at my own pace. At one point in my life I was keeping up a GitHub streak every day by just pushing a couple exercise answers to a private repo. After a while, I really had to go looking to find challenging enough work to keep me engaged. Books with homework like SICP, FP in Scala, Let Over Lambda, Software Foundations, Haskell from First Principles, Land of Lisp, and Progamming Languages all really offered a lot of homework to keep the streak up.

The streak really is a super power for self study of any form. It's so hard to ignore a 1600+ day streak even when you don't feel like it.

When Github took that streak counter down, I was crushed, combined with me taking a management heavy job (encouraging me to read a lot about soft skills), it really collapsed the whole system for me. One day I'd love to pick it back up, but right now I'm doing the same thing with violin as an adult learner, so that's taking up that time I'd otherwise spend on CS.

Learning violin might help with CS more than you can imagine. Giving yourself a break from something you have been doing for years/decades is absolutely necessary and will get you more excited to get back to learning about CS and prevent burnout. I know i am certainly that way. However, YMMV.
There's an app you may enjoy called Loop Habit Tracker. I used it to keep track of streaks for things I couldn't as easily track through other means. Its pretty amazing how just seeing your streaks can be so effective in building habits.
I personally think there is a lot of value in these things, particularly in cases where it's just impractical to go back to school/university or that tuition is unaffordable. Quite a few years ago I learnt software engineering and basic computer science through free, online resources (a few of which have already been mentioned in this thread), it got me a few successful interviews and eventually a job.

That was actually the first time I have self-taught myself anything with the aim of breaking into a field that had no experience with. It was difficult at the beginning because I had just quit the job I had back then and fell into depression for a personal, unrelated reason; but perhaps that was also the reason that I eventually had the drive and focus to get through what I would normally have found "boring" at the beginning — I had nothing better to do. The experience turned out to also be one that is empowering because now I feel like I could learn a lot of things by myself.

Not sure if it helps, but here are a few things base on personal experience of going through this type of syllabuses:

* Assuming that they are written by people who are good what they do and know what they are talking about, these syllabuses are usually to be followed through step-by-step unless explicitly stated otherwise.

* Different people benefit from different modes of learning. There is nothing stopping you from using auxiliary resources to help you to get through a syllabus.

* More often than not it takes a few reads of some text/attempts of an exercise for me to really understand something. In one particular case I read through a book three times, about half a year a part each time, before I felt that I really understood it; and when I finally understood most of it, I was only glad that I decided to try it again for a third time.

* I think it helps to have someone to talk to about what I was doing, it could be a close friend or family who doesn't understand anything about what you are studying. Alternatively, if what you are studying is "popular" enough and there are communities of people doing the same—get connected. Emotional support helps.

* I always try to interact with people who are at different skill levels. There is always a lot to learn from people who are much more experienced than I am; and explaining what you have learnt to someone less experience helps to consolidate what I have learnt.

* Focus is very important. Find what works best for your through experimentation: if you can sit through some given material for a couple of hours straight, great (but do take care of your health and at least get some stretches and water); if you regular breaks, that's also fine—just make sure you set an alarm clock and commit to getting back to it when it goes off.

On a somewhat related point, for freely available resources, I would buy a coffee or make donations where possible to people who devote their time to help others. :)

I hope you will find something that works for you! Good luck!

Similar to you, a lot of what I have learned in CS/programming has been through experimenting (personally I like the Jennifer Dewalt method of just doing a lot of small projects: http://jenniferdewalt.com). You are not bad at studying! We all just have our own learning methods that are most comfortable. A proper education system would ask you what ways you like to learn, then have multiple versions of the same curriculum taught in different ways. Somebody build that please.
I think I'm pretty good at self-teaching w/ textbooks. I will admit that there were 1 or 2 classes at college where I completely skipped the class and just read the textbook because I could absorb info faster than attending lecture.

I got a copy of Benjamin Pierce's `Types and Programming Languages` and I've read basically the full thing and have completed 80% of the exercises.

Currently working through a couple other textbooks slowly. I find that taking notes and doing the exercises is essential, otherwise I lose interest. (Same with online video courses)

Both are important. You do need to work on your own projects and own concrete case, find tricky cases, look up suggestions online, etc. It can be a great learning opportunity. For example, back in the day I used to do a lot of video recoding, ripping DVDs to SVCD, so I had to learn what the terms mean in the programs and why results weren't as I expected. This led me to learn basic concepts and a mental model of coding theory, color spaces and signal processing. Or when I built a website, I had to learn about networking, about programming some Javascript, etc. just to get the website to display. Similar with game modding, learning about graphics, textures, scripts, writing code to decode, modify and encode binary files containing text to translate them from English to my language. This meant I had to learn about character encodings etc. If you have a personal purpose in mind, learning can "just happen". I didn't intend to learn the things, I was just striving to make the thing work.

I have no idea how I'd make someone interested in these things if their mind doesn't pop up such tinkering goals for them.

On the other hand, the above is very inefficient in itself. It is hard to overstate the importance of reading good books, besides the practical learning of the above paragraph.

You need to be able to relate to the topics to some degree, but once you have the hang of it, you can benefit from the years and years of experience of experts and hone your mental models, discover new topics and relations across topics and understand things more holistically.

Learning only from books/courses is not sufficient, you won't be able to apply what you learned if you don't constantly try to map from what the book says to something you are already familiar with a little bit.

But you have to pick good books. Bad books can be more confusing and discouraging. I think American CS books especially from MIT Press are really high-quality. They may be expensive (but there's LibGen).

You may also have problems with delayed gratification. The benefits of an hour spent on reading a textbook will be vague, uncertain and delayed and often hard to attribute to the book. One hour of watching Netflix or Youtube or browsing through 20 genuinely interesting links from HN feels more rewarding. This is a big problem for us all in today's attention economy. You need to be very conscious of this to break out of it.

I learned networking through reading the book recommended in this website, and playing around with wireshark along with some other stuff. The book itself was about 800 pages, but breaking it down by sections made the task much more manageable
I'm sure many do but clearly the hardest part isn't actually following a list. It's finding or creating the discipline necessary to actually go through the entire list.
I finished two courses on the list. All I feel is: I wish I had watch/read this earlier.

I thinks I had much more fun from these courses after I have done many real projects in these years.

Maybe you get bored because it's little bit easy and basic for you.

I finished university some time last century; so, most of what I know is self taught at this point. Also, software engineering is more of an apprenticeship thing than something a university professor without relevant software engineering experience can do.

I'm being harsh here because I used to have software engineering as a topic for my Ph. D. studies. Part of the reason I left the academic world (after a postdoc) was a bit of impostor syndrome where I realized I was telling others how to engineer software without having much experience engineering software. This always struck me as odd. I've since learned a lot about software engineering that was definitely not part of any computer science studies I know off.

I always think of college being more about learning to learn than to learn anything specific. Also the difference between university and a technical school is that the former tends to be exactly about being less about practical skills and more about skills you need to learn new stuff and ask critical questions. Quite a few projects I've been on over the years have also required me to dive into other domains. I've had to read up on metallurgy, geo spatial algorithms, and medical stuff at various points for different projects.

I would say MOOCs are usually much easier to follow than books. Great courses can really change your whole perspective. The list of MOOCs listed in OSSU are generally of very high quality and I would highly recommend them.
how much of this curriculum is necessary for a FAANG job?

I’d love to go through all of them, but I’m constrained with work as well, so I’ll have to prioritize.

Honestly, start with web or mobile development and start working on projects. Start with the fundamentals and go from there. CS theory is great but it’s not gonna pay the bills.
FAANG interviews do cover DS, algorithms, math, and OS, though.
Pretty necessary, I cant imagine working at a FAANG without at least having read and understood "Designing Data-Intensive Applications" cover to cover.
Really cover to cover? Don't think that's necessary unless you have deep interest in the subject. There are folks who can barely walk and chew gum at the same time, working at FAANGs.
More than all of it, but also none of it.

You can always just hack the interview process if your primary goal is a job at a particular Big Co. In that case, learning all of the material is probably an extraordinarily inefficient path toward your goal.

But "any dumbass can hack can hack mega-corp hiring processes" is sort of obvious. If your goal is to do the real thing, as opposed to knowing how to hack the American Corporate Tech Giant mechanism for determining whether you know the real thing, then the answer is "teaching yourself the content knowledge in this list sort of misses the forest for the tress".

I think a lot of low-cost/open source/self-directed programs sort of miss one of the points of education. The reason for learning all that stuff in CS courses is more than just the content knowledge. It's also the intellectual history of the field, the problem solving approaches, how people in this field communicate, etc.

If you think of fields like Econ or Law or Medicine, it's easier to see. There's some raw content knowledge (the rules of evidence, human anatomy), but also there's the huge amount of stuff around that content knowledge. Like, yes you need to know the rules of evidence and the names of every bone. But... there's also a bunch of other stuff you're supposed to be picking up as a result of going through the process of learning that material. The self-study approach somehow misses a lot of the "stuff you're supposed to learn as an effect of learning the material", especially in CS.

I just want to feed my family... I’ll worry about enlightenment later.
Having an actually solid foundation when you're being paid 300K to be expert isn't "enlightenment". It's "appropriately qualified".

Hacking the hiring process has a good effort vs reward ratio, but it's also high risk. The risk is that obvious gaps in the candidate's background surface after starting the position. Which usually doesn't turn out well: best case career stagnates and worst case the candidate ends up on the bottom of a stack rank when things get lean.

It's a risk that can be taken in a calculated way. Sometimes things turn out well. Sometimes not.

I really agree with this. I didn't take the distributed systems course when I was at university, but later I still managed to work at a few FAANGs. Flicking through the material in the MIT 6.824 course, I really wish I learnt this before I needed it, rather than scrambling to learn it piecemeal as things came up. I would've been promoted faster, and things would've been less stressful.

It is possible to learn this on the job. But with hindsight, my advice would be to just take the easy way out and learn it beforehand.

any of the other material you didn’t quite need for the interview itself?
Then would you provide any actionable advice?

I understand your concern about not gaining implicit knowledge while surrounded by peers, but I’ve gained “the ability to think” through my other course of study, and your concerns don’t seem to be attached to a solution. Rather, it seems like a desperate attempt to gatekeep over an increasingly egalitarian field. And sorry, but there isn’t much communication to be learned among CS undergrads.

The knowledge I lack on the job will be taught as I’m exposed to my shortcomings, as is the case with most jobs.

In addition, my school’s CS department was lacking, so most of it was poorly taught, and I relied on self-teaching regardless. Once I get through hiring season, I’ll worry about covering the remaining material before I begin work.

Don't look for a FAANG job? There are plenty of enterprise IT jobs where the primary skill is putting together a web app to look like some designer's Photoshop, with pay 3-4x the median US.

"Once I get through hiring season, I’ll worry about covering the remaining material before I begin work."

Someone who has spent the time wading through this stuff might consider that somewhat insulting. Your future co-workers, say.

> Someone who has spent the time wading through this stuff might consider that somewhat insulting

ok? If I have an entry-level offer in-hand 6 months from now and I’m behind a few textbooks, I think I can manage. Sorry to break it to you, but a lot can be done if you’re healthy and avoid distractions.

If you're ever offered a 1M job, you accept it and figure out the risks later. It's much better to fail after collecting 1M, than grunting for 10 years thru a risk free 100K job.

I remember a similar conversation with a CTO of some cheap company that wanted to offer me 100K and arguing that he knew many risk takers who took on high paying jobs in bigger firms and failed. That was many years ago. Now my comp is approaching 1M, my job is super risky and demanding, but I don't care as in the worst case I quit with enough money to not work anymore. I know many vps and execs in smaller firms and their attitude is the same: they don't give a flying f..k so long as the pay/risk ratio is appropriate.

thank you. My risk profile is also higher than most. Do you mind sharing your story? I’m an undergrad looking to sell my youth. Would like to work at a non-profit once I can be financially independent with my family.
The FAANG interview process is pretty standardized, if you're pressed on time I suggest you learn and master just 2 things: data structures and system design.
> The FAANG interview process is pretty standardized

Not really. It is standardized at some FAANG companies but not others.

I like to compare CS to medicine.

Most topics of it aren't difficult to understand, but overall it's just a lot of information. If you want to get a comprehensive CS-education, you have to accept that it takes years of studying, learning and practise.

Agree with this. I’ve got a medical degree as well as self taught developer for 15+ years. The longer you do it, the easier it becomes as the knowledge just kind of seeps through immersion. But I can imagine for a mind that’s new to either topic can feel quickly overwhelmed without significant motivation to overcome that learning inertia.
Would you say CS is generally easier, with a smaller body of fundamentals, and a front-end JS dev could swap places with a back-end C# dev and the two would get up to speed a lot faster than an orthopedist and cardiologist, with all the specialized information in those two fields? Medicine just comes off like a lot more memorizing of an enormous volume of disparate information compared to programming.
From a frontend dev perspective a complex system like a living human being is nature's monolith of legacy hacks on top of legacy hacks, but you're damn right it holds up under millions of requests per second
I'd say that in CS, there's a lot more transferrable knowledge. In medicine, there's a lot of specialization and niche knowledge. The cardiologist would know very little about orthopaedic specialist, for instance. I was a GP myself, and likely knew more about medicine & surgery in general. Although I had less specific knowledge, I could integrate information better (eg. Project manager, if you will, vs database specialist).

So yes -- in CS, if you work in an area with a lot of general knowledge -- you are likely to get up to speed faster. In medicine, if you're a GP, you can probably undergo additional specialist training much quicker than someone who first pursued a single specialty first.

I wonder if there's any TeachYourself Medicine resources?
That would be very dangerous, albeit useful. Making a diagnosis and giving a therapy have different consequences than programming SW and executing code
Yes, computer systems are carefully designed to prevent programming errors from killing or injuring anyone, costing too much money, and so on.

Feel the power of the sarcasm side...

Trusting doctors can be dangerous too (personal experience)
There are many similarities indeed (eg abstraction: cell -> tissue -> organ, modularity etc) but the fundamentals are different (deterministic CS vs probabilistic biomed)
Where would one go if they had money but minimal time to get a formal online education in CS? Syllabus, other students to discuss ideas with, etc?
Send me $1000. Where do you want the diploma to say you got your Ph.d.?
Good Programmer and Code JS

where do i send it?

Are you thinking or debating if getting a deeper understanding of CS will help you or your career?

I am thinking of the same. Even though I have a Bachelor of Science (BSc) in Computer Science, it has been 14 years that I actually used any of it. I regret it sometimes since I know what it is to know how things work underneath the high level languages (PHP, JavaScript and Python for me).

Lately I have started taking more interest in CS and I think part of the reason is Rust. You could be learning Go, Swift or any similar language and come to similar feelings.

In Python (my language of choice for the last 7 years along with JavaScript) I do not really have to care about pointers, stack or heap allocation, how memory gets create or cleaned, etc. I also do not need to know if there is a virtual machine, a garbage collector, etc. Data types and how they are handled are somewhat important but I rarely get slapped by the Python interpreter for mistakes.

To me it seems that a lot of developers are choosing to go into more typed and lower level (closer to metal) languages. My gut feeling says this is happening because we can not crank up core speed from 2GHz to 3Ghz to 4Ghz and beyond as easily as we did pre-2Ghz era. Yes we hit ceilings of per-core power. But we have more users than ever before and the world seems to be eager to bring computing to even larger audiences.

All this is great, but it means developers need more refined and powerful set of tools that can work in low-power environments, boot up fast and deliver more computing throughput. The high levels of abstractions that most of us have enjoyed will stay but there will be new territories where you want to push code that is way, way more efficient. If we want to work with them, we need to know not only how to push a Template into an `<H1 />` but about the metal that is underneath. From how browsers work internally to how networks work, how processes work or communicate, how memory is allocated and so forth.

So this is a choice we have to make individually. I choose to learn and I am going with Rust and spending time to learn CS again. It is a slow process though, I have full time commitment to my product as a solo founder. Cheers!

Of course everyone should learn because otherwise they will be left behind with pay or life in general. Just setting it up in a negative way should not be there like "type 1 vs type 2". There is much more to be achieved when you are nice to people and learn to cooperate in a helpful way than when you are master of algorithms and low level operating system details.
I think it is not intentionally set up as negative. I think it is our perception since learning is hard. I have failed a lot in the last many years to learn (relearn) deeper concepts even though I wanted to.

So when I see "type 1/2" I automatically feel pressured. But that is my own incapability to stick to the subject, the books. My own procrastination. Learning is hard, escaping with an excuse about ego is way easier. Rust is already teaching me this.

A lot of people link CS with a career as software engineer for the web but leave out a lot of other software engineering and research opportunities. I get that a deep knowledge of CS doesn't always directly help while doing web development but it can really help in other area's of software development (embedded systems, OS, graphics, etc.)
>> I know what it is to know how things work underneath the high level languages (PHP, JavaScript and Python for me)

I suspect this has helped you more than you seem to know. This knowledge opens doors; gets you jobs you couldn't otherwise get; and makes you a better programmer.

>> In Python (my language of choice for the last 7 years along with JavaScript) I do not really have to care about pointers, stack or heap allocation, how memory gets create or cleaned, etc. I also do not need to know if there is a virtual machine, a garbage collector, etc.

I have seen some horrendous Python code written by people who didn't understand these things. The Python VM "hides" them from you, but they're still relevant for writing fast, correct code as almost every operation in the language ends up using one or more of those "under the hood".

Best of luck with Rust and your startup!

You are perhaps true about me not being aware that the core CS knowledge is helping me all the time. I have always been able to explain technical issues on a whiteboard all the way to the level of protocol or internals. And they have helped me immensely in my work.

I guess since I do not spend a lot of time in CS literature, I have the feeling I do not know much. But I guess I already have an edge at work without noticing it.

Thanks and best of luck to you!

I want to add something to this, something that I am understanding now perhaps because I have slowed down as a person. Learning is HARD, really really hard. More so when there are tons of social, professional and personal distractions.

On top of this I am chased by procrastination. I have gotten a much better grip at this. But just as an example - I have tried learning Rust at least 4 times before since Rust got highlight on HN I guess. I failed each each one. This time, I have at least gotten to the point where I opened the documentation on Vectors! My goodness, who am I? Complete lack of patience.

This directly causes me to sense pressure when I see statements like "type 1/2" engineer. It is not the material that is attacking me. It is my own failure hiding under the shelter of ego.

(comment deleted)
I think this is an extremely common experience. At least it maps really well to what I've gone through. Small surges of "motivation" wherein I embark on projects and then they taper off, constant battles with procrastination, etc.

However, at least in my experience, it's possible to develop tools and systems to stay disciplined enough to finish what I committed to. Not every tool works for every type of project so it's a constant battle. The good news, though, is that you can fail at this as many times as you'd like (I certainly have) but you only have to succeed once!

Rust also seems like a great choice because of its close ties with WebAssembly. Web developers who learn it should have an advantage as the tooling starts to get better around WASM.
This is a pretty good website. But I have a huge problem with the premise as stated at the beginning of the website:

"If you’re a self-taught engineer or bootcamp grad, you owe it to yourself to learn computer science. Thankfully, you can give yourself a world-class CS education without investing years and a small fortune in a degree program"

.. They then go on to list various categories of information and skills in each high-level topic.

First of all, it implies that someone who is "self-taught" may be basically equivalent to someone who just finished a bootcamp. That is ludicrous. A "self-taught engineer" might have been programming and studying computer science topics for 30+ years, whereas someone who only attended a bootcamp may have only had four months of training or something.

Secondly, it implies that self-taught engineers do not have computer science knowledge or skills. This is also a ridiculous belief.

Now, examining the specific list of topics.

'Programming. Don’t be the person who “never quite understood” something like recursion.' -- This implies that self-taught engineers do not understand recursion. If someone calls himself a "self-taught engineer" or "bootcamp graduate" and does not understand recursion, then he should not call himself an engineer and/or should not have been allowed to pass the bootcamp. Again, this description shows that the creator of the website assumes that "self taught engineers" and "bootcamp graduates" in fact have virtually no useful skills and knowledge. Its asinine and quite insulting.

'Algorithms and Data Structures. If you don’t know how to use ubiquitous data structures like stacks, queues, trees, and graphs, you won’t be able to solve challenging problems.' The ridiculous implication here is that self-taught engineers don't know what a stack, queue, or tree is.

Another general criticism I have is that the creator of this website seems to think that watching videos and reading books is a good way to learn. Unless the books or videos have exercises (and the book recommendation I saw did not have exercises), that is horrible advice and a huge waste of time. If you are just looking for something like a survey or reference, passively watching the videos or reading the books could be useful. However, there is nothing so special about these books or topics that they cannot be learned about from many different websites.

I would recommend http://www.bottomupcs.com/ if you're looking for a quick crash course. It's a bit out of date but its the shortest book I've found which covers most of the computer science stack.
How I as a mechanic major started in CS:

My lab had a project that nobody tended to, an evangelist at the lab told me all the good things about linux and git so I bought a burner laptop for $250, wiped the disk, installed ubuntu and wrote 3000 lines of the crappiest code you can ever imagine.

But it worked.

So now when someone ask me for advice to start fresh in software engineering, I always tell them you just have to wipe your computer and install $DISTRO. And start from the terminal, everything else will just come naturally (with deadline pushing it might get faster).

At 200 hours per subject, it would take 2 years to complete if studying part-time (20hr/week) during only the working weeks of the year (92 weeks). If you're uncomfortable working+studying 60-70hrs a week, it would probably take 4 years.

Are there blog posts around where people share their experience of undertaking and completely this endeavour?

Heck, I don't know of any blogs with people sharing their experience of an undergrad CS degree.
Good point. I’ve been meaning to write up my experience, because I feel that it was really poor and Australian students need to be more aware of how sub-par our CS education system is.
Is this computer science books? Seems like great computer engineering books but I have only read a few of the suggested ones.

Is there any math or science in those books (aka, could I write a paper from it)?

Anyone that have read them that care to chip in?

I think you have a very strange definition of computer science.

There isn't enough math, but there's nothing in the undergrad CS curriculum most places to "write a paper from".

I really liked "The Computing Universe" by Tony Hey. It's a book which covers most of these topics on a higher level, but I felt it was (very roughly) an abstract of what I learned in the first CS semester. So I find it a very good introduction into the field for interested non-CS people.
I'd like to know the reasoning behind replacing the very approachable, concise, hands-on and doable Nand to Tetris course with what looks like an enormous textbook.
Are you reading a different article to the one being linked?