
Teach Yourself Computer Science - JDW1023
https://teachyourselfcs.com
======
karmicthreat
One thing I'm always amazed by when casually talking to people about what I do
is how they don't think they can do it. Many people think that software
engineering and programming are some inscrutable thing. Sometimes I try to
tell them that it is nothing special, it doesn't take a mega genius or math
expert to do it. That the most important skill is just being able to solve
real problems, soft skills and breaking problems into parts. As well as the
ability to self learn and research. I get the idea that most people don't
believe that though. Or they think its a humblebrag. Rant done, it's just
frustrating that people limit themselves like that.

~~~
hnarn
> the most important skill is just being able to solve real problems, soft
> skills and breaking problems into parts. As well as the ability to self
> learn and research.

Seeing a very non-technical friend of mine being completely immersed in games
like "Factorio" and "Satisfactory" where the entire game is essentially just
putting constantly more complex and valuable resources together in automated
ways is fascinating to me. He will talk about efficiency ratios until someone
stops him, and when he's not playing he's reading wiki articles to better
understand the problems he's presented with. The sheer look of glee and pride
when he gives a tour of all the automation around his base is infectious, and
although he doesn't share my amazement at my conclusion, I can't help but
think that he's already doing what most engineers I work with do every day,
and he doesn't even realize it.

Sometimes I feel like there's so much untapped potential out there, people
that would have loved to get their hands dirty with micro-controllers,
soldering, programming and all the other stuff that could help them solve real
world problems, but they were just never given the chance. They never had the
mentorship or the right context to develop those skills. Instead, most
programming is done under soul-crushing enterprise conditions, and a lot of
teaching about programming is (understandably) only about whatever will
benefit you in the workplace. When you're an adult, there's no time for play,
so most programmers I know would rather do anything _but_ write code and solve
problems when they come home from work.

I'm not sure what my point is here, but it is interesting how people look at
programming and software engineering as something so inconceivably complex.
The way I see it, it's basically just digital plumbing and carpentry, as long
as you know how to use the toolbox: and most people will never even try it.

~~~
YeGoblynQueenne
>> The sheer look of glee and pride when he gives a tour of all the automation
around his base is infectious, and although he doesn't share my amazement at
my conclusion, I can't help but think that he's already doing what most
engineers I work with do every day, and he doesn't even realize it.

One reason why I can't really get into Factorio. It's too much like work.

The funny thing is I do code at home, for fun, in my free time- or I used to
when I had a clear line demarcating my "free time" from work time (I do AI
research and I mostly work from home, so most of the time I'm working on
something that I really have to work on). But Factorio is just ... too much
_like_ work.

... dah, I can't explain it :)

~~~
gridspy
I understand what you mean. While I'm a Factorio fan I felt this way about the
graphical-programming zachlike SpaceChem. Too much like work.

I approached Factorio like MineCraft but with the boring stuff automated.

To have fun in a game like Factorio, just mess around - you don't need to make
a perfect factory, or compete with your friend.

------
seven4
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](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.

~~~
kovek
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.

~~~
visarga
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.

~~~
niklasd
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.

~~~
kovek
Interesting perspective! And it seems connecting the dots is part of the role
of an educator!

------
panic
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?

~~~
hckr_news
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.

~~~
pretzell
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.

~~~
varrock
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.

~~~
aryzach
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.

~~~
varrock
> 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?

~~~
sli
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.

------
jgwil2
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.

~~~
kyawzazaw
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.

~~~
arcturus17
Harvard also uses the CS:APP for their first systems course, CS61.

------
brainless
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!

~~~
brainless
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.

~~~
belly_joe
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!

------
29athrowaway
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-part1)

\- [https://www.coursera.org/learn/algorithms-
part2](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](https://www.cses.fi/book/index.php)

~~~
M5x7wI3CmbEem10
I’ve heard that Part 1 of the algorithms course is sufficient for new grad
interviews. Can you verify?

~~~
29athrowaway
I got an interview that involved part 2 (substring search), which I solved
using KMP.

~~~
blackrock
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.

~~~
29athrowaway
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.

------
mcguire
That list is...not bad, as far as it goes.

I would suggest _Essentials of Programming Languages_ by Daniel P. Friedman
and Mitchell Wand instead of (or even better, in addition to) _Crafting
Interpreters_. The former is about _languages_ , the latter _compilers (or
rather interpreters)_. They are complementary.

A couple of things I would add:

 __Logic __Rather than saying it is "applied math", I prefer to view
programming as "applied formal logic". Everything from fancy type systems to
Fowler's refactoring to Dijkstra's "weakest precondition" semantics for normal
human being programming languages are simple applications of formal logic.
_Logic for Computer Science_ by Steve Reeves and Mike Clarke seems a good
choice.

 __Automata theory __Ok, if you 're going this far, you might as well go all
the way and learn what all that "finite state machine", "universal Turing
machine", and "incomputablity" crapola is about. _Introduction to the Theory
of Computation_ by Michael Sipser is pretty good.

 __Old-school Artifical Intelligence __Games. Plus, what can I say but, it 'll
come back again. _Artificial Intelligence: A Modern Approach_ by Russell and
Norvig. (Oh, there it is down towards the bottom.)

Sorry, I don't have video suggestions. And yeah, some of those aren't free.
But they're not horribly expensive either. Maybe there are alternatives.

" _Still too much? If the idea of self-studying 9 topics over multiple years
feels overwhelming..._ "

I'd have some snarky comment here, but I'm bitter.

------
ipnon
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.

~~~
pretzell
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?

~~~
throwawaygh
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.)

~~~
pretzell
I'm almost halfway through this:
[https://plfa.github.io/](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?

------
stockstreaks
Ha - super ironic that this would be atop HN today. I've recently decided to
dive back into this journey as well. Anyway - I was watching the final lecture
of David J. Malans CS50 course yesterday and found this awesome slide he
shared. I screengrabbed it and now I share it with all of you.

It's essentially "where to go from here and beyond" (by course)

[https://gyazo.com/919d9deef0d1767f685fab9b4bfc12fc](https://gyazo.com/919d9deef0d1767f685fab9b4bfc12fc)

~~~
justaj
I re-uploaded that image to a host that doesn't require JS to view an image,
because requiring JS to view an image is peak JS stupidity.

[https://i.imgur.com/yvA5Eiz.jpg](https://i.imgur.com/yvA5Eiz.jpg)

~~~
justaj
Wow, apparently Imgur is now redirecting their plain image links to pages
which _do_ require JS for viewing. Thus, Imgur has now been removed from the
list of image hosts that I use (and I suggest others to do so as well)

Instead, here's the actual image, without any the JS:
[https://i.postimg.cc/hjzXvrNc/yvA5Eiz.jpg](https://i.postimg.cc/hjzXvrNc/yvA5Eiz.jpg)

------
cel1ne
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.

~~~
drchiu
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.

~~~
jimmaswell
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.

~~~
drchiu
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.

------
thundergolfer
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?

~~~
mcguire
Heck, I don't know of any blogs with people sharing their experience of an
undergrad CS degree.

~~~
thundergolfer
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.

------
hliyan
Though it doesn't cover programming directly, I've always loved _Computer
Science from the Bottom Up_ \-
[https://www.bottomupcs.com/](https://www.bottomupcs.com/)

------
dang
See also:

2018
[https://news.ycombinator.com/item?id=17581589](https://news.ycombinator.com/item?id=17581589)

2017
[https://news.ycombinator.com/item?id=13862284](https://news.ycombinator.com/item?id=13862284)

~~~
hejja
not op, but i think it's good enough to warrant reposts so new people can find
it.

~~~
grzm
‘dang is saying “see also”, not “this doesn’t need reposting.” From what I’ve
seen, reposts after a year or so are fine.

~~~
brudgers
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.

------
Iuz
Does anyone have a github 'awesome' type of page with aggregated teach
yourselfs? I would love to have it for other subjects.

------
ascotan
Having gone through all of these course myself, I'm wondering if this stuff is
really relevant to today's workforce? Compiler Design? How to build an
Operating System?

I remember in a job writing my own BNF grammer and a a parser for it to
optimize something or other and I got back basically "WTF" on the code review.

I would say database fundamentals is a must, so is networking. But honestly
the rest is iffy. When was the last time you needed to build a red-black tree?

I think programming should be a larger part of CS. And no, not in Lisp. I also
think ML needs to be more of a thing as well.

~~~
dreary_dugong
To be fair, this isn't "teach yourself the skills necessary to be successful
in a development job," it's "teach yourself computer science."

~~~
pdxandi
I'm being sincere when I ask: what would you do with a self-taught CS
background? I understand many of the larger companies require an understanding
of CS principles, but, if not to be a successful developer, how useful is a
self-taught CS education? What do you do with it if not software development?
In my somewhat limited experience, the more CS-focused folks hold PhDs, and
sometimes I feel it's more about the credentials than the education.

~~~
mcguire
Keep in mind that "successful software developer" is a fuzzy term. You can be
a successful developer if you are gluing APIs together for an internal
enterprise web app and making six figures per annum. You can also be an
unsuccessful developer in those same circumstances, if your ambitions are
different.

The "CS focused people" that you typically hear about usually have Ph.D.s
because you usually hear about (and from) people doing fancy new things. There
are many other "CS focused people" out there just keeping the lights on, or
rather keeping the backbone routers from being swamped under their own routing
tables.

------
niklasd
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.

------
miguelrochefort
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.

~~~
rhc2104
Perhaps Western Governors University could be a good fit.
[https://www.wgu.edu/online-it-degrees/computer-
science.html](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.

~~~
ApolloRising
Are they a respected degree in CS?

~~~
kyawzazaw
They are accredited and mostly pursued by already practicing software
engineers who want to check the box for a degree.

~~~
mcguire
That's not an answer. :-)

~~~
Technetium
Accredited is indeed a valid answer
[https://www.wgu.edu/missouri/about/accreditation.html](https://www.wgu.edu/missouri/about/accreditation.html)

------
bpatel576
Just going to drop this link
here:[https://news.ycombinator.com/item?id=23564832](https://news.ycombinator.com/item?id=23564832)

~~~
paulcarroty
Save you a click: TeachYourselfComputerScience Slack channel

[https://join.slack.com/t/teachyourselfcs/shared_invite/zt-f8...](https://join.slack.com/t/teachyourselfcs/shared_invite/zt-f80pmv4z-bdeyPwQq2DH9I4_Ya9IMnQ)

------
thundergolfer
Can anyone with a CS undergrad from an elite US college (Stanford, Berkeley,
MIT, Carnegie Mellon) comment on whether they feel their undergrad covered
100-200 hours worth of these subjects?

As someone with an Australian CS degree, I feel like my curriculum covered
less than half of this properly.

~~~
tinco
That's definitely strange. I studied at a university in the Netherlands which
implemented what I think was a European standard curriculum, and what this
article mentions is a subset of the first two years of the undergraduate
degree if I remember correctly.

Some elective courses are missing, and AI though it is mentioned. We also used
many of the books mentioned here. Also back when I did it there were more
seperate math courses that we shared with the maths undergrads. I know that
they stopped doing that after I graduated.

~~~
thundergolfer
I feel like a lot of my coursework was overstuffed with learning and re-
learning waterfall vs agile, and fluff subjects like 'user-centred design' and
'professional computing practice'.

The latter was basically 'how to make a resumé' and 'how to not be an arsehole
in email'.

~~~
tinco
That sounds like I might have been a professional education instead of a
scientific education. Nothing wrong with that, you could get a full computer
science degree from our university and not be able to code for shit. You
definitely can't hire university grads blindly. You often see developers act
tough about how knowing how a CPU works is important for being a developer,
and it is, but knowing that doesn't make you a good developer. It just makes a
good developer better.

------
alexashka
> 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

~~~
thewarrior
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.

~~~
hugey010
Isn't reduced education a method for keeping people content in most
situations?

------
ellsthrow
I don't understand why so many programming jobs require a comp sci degree when
very rarely do they require anything more than "programming"

~~~
Vosporos
The CS degree is not for the job, it's for the individual

~~~
banads
Can you elaborate?

~~~
lwb
See "Why Learn Computer Science" in the OP.

------
NotSammyHagar
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".

------
SZJX
The recommendation of "Crafting Interpreters" is pretty weird. 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. Dan Grossman from the
University of Washington has an excellent course Programming Languages on
Coursera: [https://www.coursera.org/learn/programming-
languages/](https://www.coursera.org/learn/programming-languages/), which I
think would be far more relevant to modern programmers than studying compilers
specifically.

------
natural219
This is very good. I would recommend this to anybody considering a career in
software.

My only problem is that it's not very pedagogical; I don't think "read and
study the foundations for 1000 hours, you twerp" is really the best approach
to ease people in.

I would recommend starting small, making a webpage or some simple fun programs
that you enjoy working on. MDN is a good resource
([https://developer.mozilla.org/en-
US/docs/Learn](https://developer.mozilla.org/en-US/docs/Learn)) for this, but
there are probably better guides / tutors out there that can personalize an
approach based on where you're at. Glitch is also cool
([https://glitch.com/](https://glitch.com/))

------
YeGoblynQueenne
There is a distinct lack of Hopcroft and Ullman from this list:

 _Introduction to Automata Theory, Languages, and Computation, 2nd Ed._

[https://www.amazon.co.uk/Introduction-Automata-Theory-
Langua...](https://www.amazon.co.uk/Introduction-Automata-Theory-Languages-
Computation/dp/0201441241)

Which is basically all the goodness in Structure and Interpretation... and any
book on compilers and interpreters. Basically, though I don't reckon that any
modern courses teach from Hopcroft & Ullman, it's a major textbook in the
field (unfortunately the 2nd ed is easier to find but the 1st has the works).

Another foundational text is Andrew Tennebaum's book on Operating Systems:

 _Operating Systems Design and Implementation_

[https://www.amazon.co.uk/Operating-Systems-Implementation-
Pr...](https://www.amazon.co.uk/Operating-Systems-Implementation-Prentice-
Software/dp/0131429388)

To be honest I don't how it compares with the book proposed in the article,
since I haven't read that book.

Finally, two personal recommendations for anyone interested in AI (as a study
of advanced CS concepts and not just as a way to make a quick buck with a
shallow understanding of a few machine learning tutorials):

 _Artificial Intelligence: A modern approach_ (Russel & Norvig)

[http://aima.cs.berkeley.edu/](http://aima.cs.berkeley.edu/)

And the free pdf of _AI Algorithms, Data Structures, and Idioms in Prolog,
Lisp, and Java_ :

[https://www.cs.fsu.edu/~cap5605/Luger_Supplementary_Text.pdf](https://www.cs.fsu.edu/~cap5605/Luger_Supplementary_Text.pdf)

Which doubles as a good textbook for programming languages in general.

------
sjperez
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.)

~~~
mathnmusic
You can find resources (including learning plans or "syllabus") at
LearnAwesome.org . For eg: Machine Learning:
[https://learnawesome.org/topics/d6e39f8d-1ba0-4d46-9fbe-771c...](https://learnawesome.org/topics/d6e39f8d-1ba0-4d46-9fbe-771c89700ebf-
machine-learning)

------
Aperocky
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).

------
ducaale
There is ArsDigita University Curriculum[1] which is an interesting one

[1] [http://www.aduni.org/courses/](http://www.aduni.org/courses/)

------
stormdennis
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.

~~~
RobertKerans
Are you reading a different article to the one being linked?

------
zvmxczxvmcz
IMAO this Type 1 and Type 2 comparison is ridiculous. And in this context Type
2 seems to me being more related to continuous and more pragmatic learning. I
have done CS and I can't remember using any of it to make money. Do CS because
you love the subject and crave for more knowledge about it. Do the Type 2
stuff if you need a job/money.

~~~
mcguire
One of my favorite interview questions was "What happens when you type a URL
into a browser address bar and hit return?" My answer went into opening a TCP
connection and DNS lookups because I'm a networking guy. And I've had the fun
opportunity to explain to someone that "no, the application is fine. No one
can reach it because NASA has a split-DNS monstrosity that is currently
broken. Again." And then there was Friday, when I was helping someone get set
up in our development environment; she was able to get to the web interface of
Gitlab, but not check out a project. I haven't heard back because she had a
meeting, but I'm betting it was because she was on the wrong VPN
configuration.

The problem with "type 2" stuff is that building a system is easier than
debugging the same system, and "it works on my machine" isn't always an
appropriate answer.

(But resigning and getting a (hopefully better paying) job before the
excrement hits the rotary impeller is _always_ an appropriate answer, I
guess.)

------
fouric
I feel like the hardest part of modern software engineering is systems
architecture. I've pretty easily picked up everything on this list that I've
touched, but I still don't know how to _organize systems_. Is this just me?
(if not, then I feel that this site misses the most important part of the
discipline)

~~~
bootloop
Because that is the the part of software engineering which needs the most
experience and general knowledge. There is no way around it. After all you
need to know the constraints around a system before even building it and that
is only possible if you have seen it before. It can help to study others
people work before starting a project in a similar domain.

~~~
travmatt
These types of problems, ones which can only know how to solve by solving
them, are known as wicked problems. Software design is well known to be a
wicked problem.

------
627467
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?

~~~
jgwil2
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.

~~~
bigasscoffee
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.

~~~
stormdennis
Yeah! Yeah! I'd say your onto something here buddy!

~~~
bigasscoffee
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.

------
t3rmi
I would recommend [http://www.bottomupcs.com/](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.

------
musicale
Of course an MS - which they recommend against - would likely cover additional
topics (computer graphics, AI/machine learning, formal methods) as well as
follow-on material to the introductory courses listed on the page.

------
danielscrubs
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?

~~~
mcguire
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".

------
tha1es
Equivalent “X guide for practitioners with deep knowledge” for any of these
(X=)fields:

Probability

Statistics

Finance

Deep learning and AI

------
sergiotapia
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?

~~~
mcguire
Send me $1000. Where do you want the diploma to say you got your Ph.d.?

~~~
sergiotapia
Good Programmer and Code JS

where do i send it?

------
M5x7wI3CmbEem10
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.

~~~
vincentmarle
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.

~~~
twblalock
> The FAANG interview process is pretty standardized

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

------
bor100003
OK, great books, I haven't read any of them. Please, can someone share
experience reading the recommended books? When did you do it?

~~~
doctorsher
_Computer Systems: A Programmer 's Perspective_: around 2012 / 2013, I went
through this book because I took a coursera course based on it. In fact, many
universities base their systems courses around this book. It is really well
written, has a great choice of topics, and phenomenal exercises [0] for
practice (some are legitimately fun).

 _Operating Systems: Three Easy Pieces_ : In 2013, I found this book because I
was frustrated with the textbook assigned for my operating systems class
(Silberchatz). OSTEP has incredibly clear and concise descriptions without
skimping on necessary details. It's wonderfully written. I was so jazzed up
about this book that I ended up sending a lot of edits / improvements, and the
authors gave me a very kind shoutout in the acknowledgements section.

 _Computer Networking: A Top-Down Approach_ : In 2013, this was the assigned
textbook for my computer networking class. I already owned Tanenbaum &
Wetherall which is good, but preferred this book. It is a more approachable
treatment of networking (without sacrificing any crucial topics), so better
for a first course.

I've heard glowing reviews of _The Algorithm Design Manual_ , _Designing Data-
Intensive Applications_ , and _Structure and Interpretation of Computer
Programs_ over the years, but I haven't personally gone through them. For the
TeachYourselfCS categories that I know the textbook landscape, I find their
selections spot-on and pretty refreshing.

[0]
[https://csapp.cs.cmu.edu/3e/labs.html](https://csapp.cs.cmu.edu/3e/labs.html)

------
dzonga
as someone with a degree in CS, they're subject matters out there like logic,
philosophy, algebra & writing. that will definitely help you out in CS.
because first and foremost you need to be good at abstract thinking, then cs
will click. and once abstract concepts click, you'll see the nonsense that the
current software engineering industry is.

------
ithrow
Shouldn't the Math for CS come before the Algo book?

~~~
bigasscoffee
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.

------
musicale
These are all good courses actually!

------
SMAAART
This is nice, simple and essential.

------
magnusmagnusson
This site has been an amazing resource for me. Easily the best 'self-learning'
way for me.

------
kang
Without formal language study, how is this computer science?

This is computer engineering. Please fix the title atleast on HN.

------
ilaksh
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.

~~~
dlhavema
Some people learn great by watching videos. Some people learn great by reading
books. I personally learned the best by taking an example ripping it apart and
changing it to do something new.

~~~
ilaksh
American Psychological Association -- "Belief in Learning Styles Myth May Be
Detrimental"

[https://www.apa.org/news/press/releases/2019/05/learning-
sty...](https://www.apa.org/news/press/releases/2019/05/learning-styles-
myth#:~:text=WASHINGTON%20%E2%80%94%20Many%20people%2C%20including%20educators,by%20the%20American%20Psychological%20Association).

