Having finished a CS undergrad and followed the OSSU curriculum for some years I can confidently recommend <a href="https://teachyourselfcs.com/" rel="nofollow">https://teachyourselfcs.com/</a> instead. The courses chosen are more focused on capital-C capital-S Computer Science, and the resources are better suited for self-paced self-direction. One should start with <a href="https://teachyourselfcs.com/" rel="nofollow">https://teachyourselfcs.com/</a> and refer to OSSU if they find the former lacking in some measure.<p>Self-teaching computer science is a long and winding road. OSSU seems to favor a completionist approach that most people would do well to avoid. Grok on the fundamentals and quickly specialize, because life is too short to learn computer science in an encyclopedic way.
100% possible to be a self-taught software engineer. I have hired many over the years. The hardest part is breaking into the industry, but once you have some experience and references the degree doesn’t matter for many high paying companies (although FAANG and academia might disagree).<p>When I interview ICs it is a very free flowing conversation. When there is a lull I will jump to a new subject. I will just start asking things and keep going deeper until I exhaust your knowledge.<p>“What is the command for listing directories in a terminal? Name a flag you can use - what does it do? How do flags actually work anyway? Do you know any libraries for CLI parameter processing? Ever heard of argc and argv? How do you think those variables are mapped into memory of the forked process?”<p>I go on and on and on. If you just become obsessed with computers and software engineering and put in some years of effort you can beat what school charges you for. Plenty of MIT and Brown and Harvard grads don’t know fuck all about software development. Credentials are a signal for sure but that is all they are.
Did anyone else cruise through college with their programming experience developed as a kid, only to come out with an excellent knowledge of practical computer programming (i.e., learned several languages, touched most of the frameworks, able to deploy full-stack apps alone) but a complete lack of mathematical and computer science knowledge? And if so, did you ever go back and re-learn some of these fundamentals and find use in it? I'm in this situation now, and while I feel confident in my ability to do my job, I feel jealous of peers who are able to solve complex algorithmic problems, or understand mathematical problem domains with ease (e.g., machine learning)
I was educated as a biologist but I am now a full time software dev (perhaps a light version, I just do Python/bash) with some science elements. I was able to make this switch because I have always (since the 2.4 kernel days) enjoyed Linux and self-hosting as much as possible, including email, which I, as 99% gave up on later again).<p>It basically made me a sys-admin, many people around me do docker these days, few can diagnose issues with Docker itself, route traffic around with valid certs, open a shell inside a container to really see what's happening. But I just feel at home inside Linux. I know my way around /etc, I know how I would do things and that is how things often are. It helps me a lot in my daily job. I feel like the whole stack is an open book to me. I still listen to a lot of Linux podcasts (like most Jupiter broadcasting shows), that also helped me a lot, also keeps me informed on recent tech.<p>I'm really getting paid for my hobby nowadays.
These types of sites are great. BUT. The concept hasn't properly evolved since the 1970s-80s when I assume it started to become pretty big.<p>I think the reason 99% of people study computer science is to get a computer programming job. Almost all programming jobs are actually software engineering jobs these days.<p>So I believe that at least one third of a degree program like this should actually be software engineering.<p>And the most important part of software engineering is the outer loop with clients or end users (or some stakeholders). So they should train on multiple project iterations with some external group as customers.<p>So the interaction with customers, defining requirements, the basic looping of iterations and maintaining software and evolving designs and technical debt, somewhat larger codebases that make modules/components/classes etc. more important. A lot of that should be integrated and probably even replace some of the lower-level stuff that would have been much more relevant in the 1980s for most application programmers.<p>It should be multiple projects that get evolved over the entire course.<p>Also another thing, a key tool to add to an education like this would have been active Google searching and learning how to do that, which should be at least a small part of the curriculum. Since the last few months, another key tool at least as important is ChatGPT.<p>The technology landscape changes rapidly. Education should keep up. Especially if its self-education, no reason to be stuck in the late 80s or early 90s.
Can someone point out where the <i>science</i> in all this is? At best, there are some courses in algorithms in the 'Core Theory' and others in the 'Advanced Theory' section, with a random spattering of in other sections.<p>Computer Science would be computational theory, complexity theory, a proof based cryptography course, the mathematics of computer geometry/machine learning type stuff.<p>About 80% of the courses here are software engineering courses - about using computers to build things. The quote 'computer science is as much about computers as astronomy is about telescopes', comes to mind.<p>Just call it 'a self-taught education in Software Engineering'.
A large part of me feels like this is an oxymoron. Someone who is capable of self-teaching this content is probably not going to need such a structured program. At best, this would function as an aspirational index for them to refer to.<p>This also covers a lot of things you should probably not be studying as self-taught dev, since there is a much larger opportunity cost because you are not at university. I like calculus and maths, but that knowledge is low value for a developer.<p>Once you've bootstrapped a basic understanding of programming and CS, I think you should be building stuff 80% and reading up on new things that catch your eye 20% until you hit diminishing returns. Reading about things like SOLID, DRY, algorithms, OOP, etc is just not going to stick. You need to build stuff and start getting an intuition for the concepts.<p>Immersing yourself in community discourse is also very underrated. You will pick up so much jargon and be exposed to lots of different concepts and tools just by hanging out where other programmers talk, like on HN, Twitter and Reddit.
Often unnoticed but very important part of the traditional education is having the peer group to compare yourself too. The desire to copy and compare each other kicks in and now it's no longer just about getting grades but rather how do you relate to each other in your common path. It would be cool if this was somehow replicated in MOOCs.
Related:<p><i>OSSU: Path to a free, self-taught education in computer science</i> - <a href="https://news.ycombinator.com/item?id=27744255" rel="nofollow">https://news.ycombinator.com/item?id=27744255</a> - July 2021 (149 comments)<p><i>OSSU: A path to a free self-taught education in computer science</i> - <a href="https://news.ycombinator.com/item?id=21062799" rel="nofollow">https://news.ycombinator.com/item?id=21062799</a> - Sept 2019 (172 comments)<p><i>Path to a free self-taught education in Computer Science</i> - <a href="https://news.ycombinator.com/item?id=16035839" rel="nofollow">https://news.ycombinator.com/item?id=16035839</a> - Dec 2017 (66 comments)
I don't think the point of universities and degrees these days is to learn anything. It's just something you have to do in order to get a good job. That was certainly my experience. I went to a so-called top university, and I didn't feel like I learnt anything remotely relevant to what I do today. All I got at the end of it was some letters after my name.
A BSc or MSc in STEM is all 99.997% of immigration and Human Resources people care about. Thus, if your goal is to augment your existing degree, than a self-directed or short certificate program is fine. However, if you want a commercial career in CS without a upper-level degree, than you may as well waste your time doing something you enjoy instead.<p>There is a huge gap between the theoretical and practical aspects of CS in both the academic and professional fields. Generally, most college programs have lab driven smaller classes, and produce better coders (ready to go in a few months). However, university level programs tend to produce primarily theorists from thousands of students (an additional 1 to 2 years of training is usually needed for a commercial setting).<p>I often recommend plumbing, as it allows folks to afford to do a postdoc. =)
As a former CS professor with some experience of curriculum design: looks quite reasonable. Personally I would have moved some of the material on compilers and architecture into the earlier part of the course (instead of putting them in the advanced section) but balancing content distribution against time is tricky.<p>The selection of areas and materials is broad enough to teach a reasonable chunk of CS. The individual course quality looks good from a quick skim.
Looking through the links, I noticed most of the course was video, so I immediately turned it off. Compared to text, videos are an inefficient learning tool, and I think a lot of people aren't aware of that. Honestly, I hate video learning materials. Though it's better than going to a classroom.
Given the trajectory that AI is taking in terms of being a very helpful code assistant, what type of CS education would be ideal for current elementary school kids? Sure, some will want to go all the way and be programming the AI; but for the rest, it would probably make sense to be able to use the tools in the same way that today's "tech savvy" can accomplish 10x as much as someone who isn't familiar with computers. What parts of computer programming will be necessary, and which parts can be summarized or jettisoned?<p>I ask this question as a mostly non-technical person, wondering what skills it makes sense to develop in my children, so they can "skate to where the puck is going", so to speak.
It's a missed opportunity to push "Projects" at the end of all kinds of course. Let's turn table around. Let's teach on how to build complex projects with its companion theory, instead of just trying your best to explain the theory first.
See also:<p>* What every computer science major should know (<a href="https://matt.might.net/articles/what-cs-majors-should-know/" rel="nofollow">https://matt.might.net/articles/what-cs-majors-should-know/</a>)<p>* learn-anything mind map (<a href="https://learn-anything.xyz/computer-science" rel="nofollow">https://learn-anything.xyz/computer-science</a>)
Note there is a very observable difference between computer science and software engineering. In Advanced Programming they offer Haskel, Scala and Prolog. While those languages are fun to learn and use for personal purposes, there's effectively zero commercial space application for them.
I've seen this before and there are great courses, but most of them cover the basics.<p>What I tried to find for myself is a bunch of in-depth courses that cover the areas where I'm not as comfortable. I've started collecting some courses (there were especially many in the COVID era simply because the universities recorded the courses anyway and only needed to upload them), books and papers. I didn't aim to get a comprehensive set of resources covering everything or having some specific features, I simply gathered what I thought is interesting for myself:<p><a href="https://github.com/kirillbobyrev/computer-science-resources">https://github.com/kirillbobyrev/computer-science-resources</a>
Computer Science?<p>If you just want a career in making computer software. Build something. Then do it again. Google all the stuff you need to build your current thing. After a few month it will be obvious to you that you can build software. Then talk to companies about junior positions. Tell them you are self-taught and show them the stuff you have built already.<p>Best to talk to a company (usually small companies are easier), where you are allowed to talk to a programmer early on. The fact that you learned everything by yourself means they do not have to hold your hand all the time. Hand-holding time is the most important consideration for me, when taking on junior devs.
I feel that CMU's 15-213 Introduction to Computer Systems [1] should absolutely be on the list. It's a mandatory class at CMU that everyone, who gets remotely near CS curriculum, must take. I feel it's completely justified. The lucky CMU students were able to take a version of this class since 1998.<p>[1] <a href="https://www.youtube.com/watch?v=4CpHpFu_KYM&list=PLbY-cFJNzq7z_tQGq-rxtq_n2QQDf5vnM&index=2">https://www.youtube.com/watch?v=4CpHpFu_KYM&list=PLbY-cFJNzq...</a>
I am doing the Math version of this currently to catch up on the gaps that my CS education missed out on. If you do plan on doing this, I cannot stress how important it is to manage expectations and be consistent with the workload. There is no pressure here and you might not even need like, 80% of what's being taught on your course but you are essentially keeping yourself active. It's like a gym except for your brain.
The problem I've faced with self-learning CS have never been a lack of resource. Skills plateauing for almost a year. I just have troubles keeping on track. Mentorship or some kind of support will be more helpful ...
this is a good resource but also don't forget to apply these by thinking and building out projects. If you don't use the knowledge, there's a high chance you'll lose the knowledge.
Nice, I'm drafting my similar syllabus for publication on my github. I love the fact that there are more open pathways to achieving a education like this. Thanks for the share!
This looks really good, though the Software Engineering course part seems a bit lacking. I think there should be a more comprehensive one on patterns and software design.
This is great. I am have hired many many engineers over many years, and I have not seen a significant difference in the quality of engineers who had a formal CS degree vs. another quantitative degree (physics, math etc.). I have noticed some differences in engineers who have gone through bootcamps, but they are usually great at getting things done, so it has never mattered.<p>Also curious if there is a list somewhere out there for similar self-taught path for other subjects?
I have devised a plan for a specific group of people (like me):<p>Group Characteristics:<p>- Has a full-time job and a family with kid(s): Basically means only 1-2 hours everyday, maybe a little more when workload is light<p>- Not super smart (probably can identify myself as median IQ at best)<p>- Did not go through a solid CS education (I came from MATH in a mediocre school)<p>- Managed to grab a developer gig by luck and self-development (for me it's mostly luck)<p>- Want to have the deepest understanding of computers and computing as possible (I just realized that computers and computing are two things, one is more about hardware and the other is more about MATH)<p>Issues identified:<p>So we probably still want to get the best education from MIT/Berkeley/etc. but the problem is:<p>- The courses are too tough for us<p>- We don't really have the mental reservoir to consume difficult topics everyday, so that means maybe a few hours of study may push me away from studying for the next day<p>- Contrary to the second point, we do need to study the material as often as possible to retain knowledge learned<p>My plan:<p>- Browse through the list of MIT/Berkeley/CMU/etc. classes and figure out a list of courses. I want to study reverse engineering so my list:<p><pre><code> - Introductory to programming (I want to skip this one but local university doesn't allow me, see below)
- Computer Architecture
- Data Structure and Algorithms
- Theory of Computing (basically pre-requisite for compiler theory)
- Operating System
- Compiler Theory
</code></pre>
- I then registered in local university. It's a mediocre one but it fits in the bill of giving me a general understanding of the topics<p><pre><code> - The lab/assignment is really easy, like in OS class it doesn't even touch anything about writing functionalities for a student OS
- The exams are annoying, mostly about memorizing things, but since I don't care about score I just get by
- I have to take a few extra pre-requisite courses such as Introductory to Programming and Discrete Math but I'm fine, good to pump to GPA in case I fuck up something in the future. I want to have an average of B
</code></pre>
- I'm going to take one course per semester and study the corresponding MIT/Berkerly/CMU course in the NEXT semester, so basically I always have two classes going on from the second semester. The workload is more manageable and more importantly I already know something before taking the courses of tougher tier schools.<p>I'm now on Data Structure and Algorithm so next semester I'm going to take Theory of Computing in local school + Algorithm in tougher tier school. I hope it can ease my way into the topics so that I don't burnout quickly.