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.
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.<p>~Some Existing Touch Point With CS<p>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.<p>~Relatively Fresh - but have strong intent<p>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. (<a href="https://github.com/ossu/computer-science" rel="nofollow">https://github.com/ossu/computer-science</a>)<p>~Intrigued/Engaged - but intent is still nascent<p>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.
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.<p>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?
Main updates as of May 2020:<p>Computer Architecture: added <i>Computer Systems: A Programmer's Perspective</i> as first recommendation over nand2tetris.<p>Compilers: <i>Crafting Interpreters</i> added as first recommendation over dragon book.<p>Distributed Systems: added <i>Designing Data-Intensive Applications</i> as first recommendation over <i>Distributed Systems</i>.<p>Online availability of some video lectures has changed as well.
Are you thinking or debating if getting a deeper understanding of CS will help you or your career?<p>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).<p>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.<p>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.<p>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.<p>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.<p>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!
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:<p>- <a href="https://www.coursera.org/learn/algorithms-part1" rel="nofollow">https://www.coursera.org/learn/algorithms-part1</a><p>- <a href="https://www.coursera.org/learn/algorithms-part2" rel="nofollow">https://www.coursera.org/learn/algorithms-part2</a><p>There's a website for the book as well, that has code that is well organized and commented.<p>Unfortunately excellent books like "Programming Pearls" have code examples that use weird naming conventions that just make me just want to punch the wall.<p>For competitive programming and interviews, Antti Laaksonen's books are fantastic: <a href="https://www.cses.fi/book/index.php" rel="nofollow">https://www.cses.fi/book/index.php</a>
That list is...not bad, as far as it goes.<p>I would suggest <i>Essentials of Programming Languages</i> by Daniel P. Friedman and Mitchell Wand instead of (or even better, in addition to) <i>Crafting Interpreters</i>. The former is about <i>languages</i>, the latter <i>compilers (or rather interpreters)</i>. They are complementary.<p>A couple of things I would add:<p><i></i>Logic<i></i> 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. <i>Logic for Computer Science</i> by Steve Reeves and Mike Clarke seems a good choice.<p><i></i>Automata theory<i></i> 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. <i>Introduction to the Theory of Computation</i> by Michael Sipser is pretty good.<p><i></i>Old-school Artifical Intelligence<i></i> Games. Plus, what can I say but, it'll come back again. <i>Artificial Intelligence: A Modern Approach</i> by Russell and Norvig. (Oh, there it is down towards the bottom.)<p>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.<p>"<i>Still too much? If the idea of self-studying 9 topics over multiple years feels overwhelming...</i>"<p>I'd have some snarky comment here, but I'm bitter.
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.
I like to compare CS to medicine.<p>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.
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.<p>It's essentially "where to go from here and beyond" (by course)<p><a href="https://gyazo.com/919d9deef0d1767f685fab9b4bfc12fc" rel="nofollow">https://gyazo.com/919d9deef0d1767f685fab9b4bfc12fc</a>
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.<p>Are there blog posts around where people share their experience of undertaking and completely this endeavour?
Though it doesn't cover programming directly, I've always loved <i>Computer Science from the Bottom Up</i> - <a href="https://www.bottomupcs.com/" rel="nofollow">https://www.bottomupcs.com/</a>
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...<p>For context, I recently received a lot of pressure to get a degree, despite years of experience and good knowledge of CS fundamentals.
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.
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?<p>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.<p>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?<p>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.
Just going to drop this link here:<a href="https://news.ycombinator.com/item?id=23564832" rel="nofollow">https://news.ycombinator.com/item?id=23564832</a>
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?<p>As someone with an Australian CS degree, I feel like my curriculum covered less than half of this properly.
> If you’re a self-taught engineer or bootcamp grad, you owe it to yourself to learn computer science.<p>No, you don't.<p>I know all these topics and I don't recommend anyone working in a corporate environment to learn <i>any</i> of this. It'll likely result in you resenting your job, your peers and the entire software industry.<p>---<p>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.<p>1:16-18; King James Version
I don't understand why so many programming jobs require a comp sci degree when very rarely do they require anything more than "programming"
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".
This is very good. I would recommend this to anybody considering a career in software.<p>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.<p>I would recommend starting small, making a webpage or some simple fun programs that you enjoy working on. MDN is a good resource (<a href="https://developer.mozilla.org/en-US/docs/Learn" rel="nofollow">https://developer.mozilla.org/en-US/docs/Learn</a>) 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 (<a href="https://glitch.com/" rel="nofollow">https://glitch.com/</a>)
There is a distinct lack of Hopcroft and Ullman from this list:<p><i>Introduction to Automata Theory, Languages, and Computation, 2nd Ed.</i><p><a href="https://www.amazon.co.uk/Introduction-Automata-Theory-Languages-Computation/dp/0201441241" rel="nofollow">https://www.amazon.co.uk/Introduction-Automata-Theory-Langua...</a><p>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).<p>Another foundational text is Andrew Tennebaum's book on Operating Systems:<p><i>Operating Systems Design and Implementation</i><p><a href="https://www.amazon.co.uk/Operating-Systems-Implementation-Prentice-Software/dp/0131429388" rel="nofollow">https://www.amazon.co.uk/Operating-Systems-Implementation-Pr...</a><p>To be honest I don't how it compares with the book proposed in the article, since I haven't read that book.<p>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):<p><i>Artificial Intelligence: A modern approach</i> (Russel & Norvig)<p><a href="http://aima.cs.berkeley.edu/" rel="nofollow">http://aima.cs.berkeley.edu/</a><p>And the free pdf of <i>AI Algorithms, Data Structures, and Idioms in Prolog, Lisp, and Java</i>:<p><a href="https://www.cs.fsu.edu/~cap5605/Luger_Supplementary_Text.pdf" rel="nofollow">https://www.cs.fsu.edu/~cap5605/Luger_Supplementary_Text.pdf</a><p>Which doubles as a good textbook for programming languages in general.
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: <a href="https://www.coursera.org/learn/programming-languages/" rel="nofollow">https://www.coursera.org/learn/programming-languages/</a>, which I think would be far more relevant to modern programmers than studying compilers specifically.
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.)
How I as a mechanic major started in CS:<p>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.<p>But it worked.<p>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).
There is ArsDigita University Curriculum[1] which is an interesting one<p>[1] <a href="http://www.aduni.org/courses/" rel="nofollow">http://www.aduni.org/courses/</a>
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.
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.
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 <i>organize systems</i>. Is this just me? (if not, then I feel that this site misses the most important part of the discipline)
I wonder if anyone here has tried this (or other) self taught CS successfully while not being a "self-taught engineer or bootcamp grad".<p>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?
I would recommend <a href="http://www.bottomupcs.com/" rel="nofollow">http://www.bottomupcs.com/</a> 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.
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.
Is this computer science books? Seems like great computer engineering books but I have only read a few of the suggested ones.<p>Is there any math or science in those books (aka, could I write a paper from it)?<p>Anyone that have read them that care to chip in?
how much of this curriculum is necessary for a FAANG job?<p>I’d love to go through all of them, but I’m constrained with work as well, so I’ll have to prioritize.
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.
This is a pretty good website. But I have a huge problem with the premise as stated at the beginning of the website:<p>"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"<p>.. They then go on to list various categories of information and skills in each high-level topic.<p>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.<p>Secondly, it implies that self-taught engineers do not have computer science knowledge or skills. This is also a ridiculous belief.<p>Now, examining the specific list of topics.<p>'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.<p>'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.<p>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.