Complete Computer Science Self-Study Guide
Tags: computerscience, tutorial, codenewbie, beginners
Published: 2021-05-31 03:13:34

# Intro 🔖

![Computer Science Degree Cost](https://www.guide2research.com/wp-content/uploads/2020/07/computer-science-tuition-cost.jpg)

Let’s face it. Getting a computer science degree does not make you any more capable than someone who takes a self-study route. Through the process of self studying, you can gain more practical skills for the real world and don’t have to spend time worrying about useless general education (Gen Ed) classes that colleges force upon their students. Self-taught coders lack a degree but save tens of thousands of dollars and can learn just as efficiently as they are not tied to a curriculum.

If you take the self-taught route, you can jump around books, courses, and projects, all while learning *just what you need*. As long as you can prove your skills and make enough projects (check out my article about [project-based learning](https://dev.to/salarc123/the-benefits-of-project-based-learning-3c14)) to create an appealing resume, your shot at getting a job will be just as good as computer science graduates, or even better. 

Additionally, I assume if you're reading this article that you are passionate about coding, so this whole process should be enjoyable. And time flies when you're having fun, so if you're up for the challenge, don't think of it as a laborious task each day. If you start to lose motivation or feel burned out from all the new knowledge that you're taking in, take a short break and come back a few days or weeks later. 

So, how do you self study computer science? Well, I created a list of big ideas in CS and resources to learn them. The list might seem overwhelming, but remember that even if this takes you 2 years to complete, you'll still have an edge over computer science majors.

*Bonus tip: for maximum success, blog your life throughout the process of self studying so that you can get a group of people holding you accountable to your goal. This way, you will be less likely to give up. You can also utilize the Feynman Technique by attempting to teach what you learn. If you make any mistakes, the DEV community will surely help you out and clear any misconceptions*


# Programming 👨‍💻
![Coding](https://cdn.stocksnap.io/img-thumbs/960w/coding-programming_CWYK8CLC61.jpg)

Programming is crucial because it lets you apply everything else that you learn in computer science, so it should obviously be the first step. To start programming, I recommend that you start learning either Python or Javascript first. You don't want to start with something too complicated like C++ as difficult concepts will confuse you until you've lost motivation. Obviously, you won't stick to one language for the rest of your life, so you can branch out once you feel comfortable with basic concepts. I like the pseudocode aspect of Python, but Javascript lets you more visually see what you're doing, which I think is extremely important for beginners and really makes the learning process fun. However, you'll need to start by learning HTML and CSS which aren't programming languages so you won't be learning concepts as quickly, especially since web development is pretty different from every other computer science specialization.

If you want to get started with Python, I think the single best book is [Automate The Boring Stuff With Python](http://index-of.es/Varios-2/Automate%20The%20Boring%20Stuff%20With%20Python.pdf) which is completely free. This book is broken into two sections with the first part teaching python/computer science basics and the second part teaching how to automate tasks and use practical libraries. The end of each chapter includes practice projects which I found to be really beneficial. This book nails down the fundamentals really well, so you could just read the first part if you don't care too much about automation. Additionally, there is a [Udemy Course](https://www.udemy.com/course/automate/) for the book taught by the author Al Sweigart

If you still go to school, I would recommend that you spend passing periods or free time reading through [w3schools](https://www.w3schools.com/python/default.asp) tutorials to refresh your memory and try to consolidate what you have learned. If you're really passionate about computer science, this shouldn't be too hard to incorporate into your day.

If you want to brag to your friends, you could take **Berkeley's** free [CS61A course](https://cs61a.org) which teaches the fundamentals of programming using Python

# Algorithms and Data Structures 🚀
![Graph Theory](https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/6n-graf.svg/1200px-6n-graf.svg.png)

Algorithms and data structures may seem irrelevant for a majority of computer science specializations, but I still think that everyone should learn them. You might not use them in a web development job, but learning algorithms and data structures can change how you think and make you become more attentive to efficiency which is a plus for any job. 

To learn these two things, I recommend competitive programming (check out [my article](https://dev.to/salarc123/the-best-way-to-learn-algorithms-and-data-structures-24cn) about CP if you're interested) because it makes the learning process almost like a game as you get to compete with others in tournaments.

Some good courses for algorithms and data structures include **Princeton's** [Algorithms I](https://www.coursera.org/learn/algorithms-part1) and [Algorithms II](https://www.coursera.org/learn/algorithms-part2) as well as Berkeley's [CS61B](https://sp21.datastructur.es) but it uses Java (it teaches the fundamentals of Java so you can be a beginner to Java and do fine in the class)

# Math 🧮
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/87epcq2bd72lgzmjvhr8.png)
 
Much of the computer science major revolves around math, so you should spend a considerable amount of time dealing with college-level math. I recommend that you take courses on calculus, linear algebra, and discrete math at a minimum. Alternatively, you could just take the free [Mathematics for Computer Science] by MIT and get a decent understanding of the math that you will need to get by, but you won't have an advantage over people with computer science degrees if you don't explore other courses. 

edX has [Calc 1A](https://www.edx.org/course/calculus-1a-differentiation), [Calc 1B](https://www.edx.org/course/calculus-1b-integration), and [Calc 1C](https://www.edx.org/course/calculus-1c-coordinate-systems-infinite-series) for free and taught by MIT, so you should start with these three. After that, you should take UTAustin's two part linear algebra courses ([part 1](https://www.edx.org/course/linear-algebra-foundations-to-frontiers), [part 2](https://www.edx.org/course/advanced-linear-algebra-foundations-to-frontiers)) which goes from foundations to advanced linear algebra. These courses are really long, so you can probably get by with only the first linear algebra course. Lastly, for discrete math, this course called [Discrete Mathematics and Functional Programming](https://cs.wheaton.edu/~tvandrun/dmfp/) seems really promising and incorporates programming into your math education which universities don't do. 

# Languages and Compilers ✨
![Programming Languages](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y64u0q3132245wz1lojz.png)

Creating compilers for a preexisting language or creating your own programming language is a really good project for a resume and can show that you really know what you're doing, despite not having a computer science degree. Thus, acquiring a fundamental understanding of programming languages and compilers can be very beneficial to your future career. 

You should start with [Crafting Interpreters](https://craftinginterpreters.com/contents.html) by Bob Nystrom and then immediately try to create a project from the knowledge you get in the book. This topic can be directly applied to a project and can turn out to be more fun than you might expect.

# What about web development? 🗣️
![Web Development](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h8op73pz4ozkp77irq2t.png)

Obviously, this list was structured around a college computer science curriculum, so web development was not included. This list also does not tailor to any other specializations, such as data science or game development, because this list is supposed to help you get a general understanding of computer science. Finding a niche or specialization should be done afterwards or on the side, but one should get a fundamental education in computer science first. If you plan to go into web development for your career, this information is still relevant because it gives you a competitive advantage over other self taught web developers and can expand your job opportunities. So, overall, you should explore programming, data structures and algorithms, math, and languages and compilers through the aforementioned courses and books. This process will take much less time than a college degree and lets you focus on solely relevant content. Good Luck!

*If you disagree with my opinions, feel free to leave a comment. I would like to hear some opposing viewpoints!*