Computer scientists—in particular, software developers—are among the most sought after jobs in today's world. Jobs in software tend to pay very well and are usually enjoyable. If you've seen Google's employees in their work spaces, you'd think they were working in a resort. Six figure income is something that people in less privileged areas of employment can only dream of. There is also a joy in making something of your own design come to life as you continue to improve its implementation.

Unfortunately, getting a good job in the field is very demanding. However, this might actually work in your favour. If less people are willing to put in the effort necessary to get such a comfortable and well-paying job, all you need to do is put in the extra effort to out-compete them for the job. For most people, this extra effort often means getting into a good college and getting a degree. To some, a degree may seem like the bouncer preventing you from getting into a bar and getting laid later that night. It should come as a surprise to you that you absolutely do not need a degree of any sort to get a good job in computer science.

**Reasons why you shouldn't get a Degree**

Degrees are problematic. Degrees are expensive and take a long time to complete. Student debt is also one of the main financial killers for adults in America. Some people even receive admissions into universities and obtain degrees when they don't deserve it—as recent admissions bribery scandals have shown us. There must be another way, right?

Employers have been gradually moving their focus away from a degree and more towards what you've accomplished when it comes to jobs such as software development. This means that employers will not hire those who do not deserve a job at their company but *will* hire the most demonstratively competent people. This presents a huge opportunity for you to be working on real world projects, building up your portfolio on GitHub instead of handing in half-assed exam papers.

Some people such as your parent or guardian may stress the importance of attending college for the social experience and can fill your head with the fear of missing out. Any people you network with; any sex you'll have; any recreational drugs you'll experiment with; any parties you'll attend, can all be done outside of college. For anyone interested in computers, you can get a job that pays well without missing out on much in college.

Taking away the prerequisite of a college degree opens up a whole new world of possibilities. You could get started on your journey as young as you wish. If you have the willpower, you could start learning some real shit at literally 13 years old. You will need no small amount of dedication and persistence in order to accomplish this. Teaching yourself a few years worth of high-education is a difficult task, especially when you don't know where to start. I'm going to relieve you of the long search for the best way to start and actually get you started today.

There have been great efforts to keep software as open as possible. This applies to books, codebases, tips and tricks and more. Every book on every reading list of every computer science curriculum is freely available on sites such as Library Genesis. Library Genesis has millions of books in various formats—PDF, ePub, AWS3, DJVU—all for free. You don't have to buy your books nor have a limit on the time you have with books you borrow from a library. Now that I've given you a means to learn anything you want, what do you learn?

LibGen — http://gen.lib.rus.ec

I've combed through many university computer science curriculums including curriculums from: Harvard, MIT, Oxford, Cambridge and Imperial College London. All of these curriculums have most of the same topics taught with only slight variations in the courses offered. From the information I've gathered, I've put together a reading list to help you go from nothing to one of our best. Not just will you save yourself money and stress, you'll also save time. How much time?

I figured out a way that is allowing me to fold my time at university for computer science in half. This is not one of those guides that shows you how to learn an entire skillset in a month or even a few months. This is a realistic view of what you can do in a shorter period of time (1-2 years). A typical master's degree in computer science takes 4 years while a Bachelor's degree takes 3. Please take a moment of the time I'm saving you to appreciate the sheer magnitude of what is happening to your life right now. If you put this into perspective, that means if you started learning at age 13, you could have the equivalent of a bachelors in computer science at one of the world's most prestigious universities by time you're 15. How fucking cool is that?!

You might be asking: "How will I get a job at 15? I'll still have high-school by then." Well, you can fill out the time working on projects, building your portfolio and gaining experience. With the knowledge you gain, you might be able to obtain a GED or take your A level exams early. All the extra work you'll have put in will save you years of your life that you could use for things that are much more important to your future.

Another question you might ask is: "What about mandatory projects and exams for the courses I'm teaching myself?" Your mandatory projects become your personal projects that you want to do and are not forced to do. Any "lab" used to explain new concepts can be simulated and you can teach yourself from example. Finding people for group projects is incredibly easy in the open-source community. People you will work with and will gain trust for are already waiting for you on Discord servers, Telegram groups, Subreddits and IRC.

Without any further delay, I'm going to present you with a road map of skills to master on your journey. If you put in 2-4 hours a day learning the material, you could easily turn one year's worth of learning into 3-6 months. BEGIN!

**Year 1:**

Year one will be your hardest year. In this year, you're going to go from 0 to 1. The rest of the years are taking you from 1 to n—where n is wherever you want to end up. All subjects in your first year are compulsory and foundational. You'll learn two different subjects: Mathematics and Programming.

Continuous math, discrete math, introduction to formal proof, linear algebra and probability are the topics in math you'll be learning. You may be thinking: "what's the difference between continuous and discrete math?". Continuous math is concerned with change while discrete math is focused on representation and groupings.

The continuous math you'll be learning is Calculus. Calculus has a stigma surrounding it that makes you and your parents shiver. In reality, Calculus is actually pretty easy and makes intuitive sense. All your algebra, polynomials and functions have been leading up to Calculus—it's the next logical step. Calculus is really good at finding approximations to rates of change that model the real world. You typically read an entire textbook where you learn about Limits, Derivatives, Integrals, Infinite Series, Vector Calculus and Multivariate Calculus. I recommend Calculus: Early Transcendentals by James Stewart. This book really helped me but explaining so well that I could easily read 50-70 pages a day while still filling up pages or exercises.

Discrete math is where you'll learn about groupings and relationships between them. Sets, graphs (as in graph theory), trees, boolean logic, etc. Most problems in computer science are discrete (finite) in nature due to computers being discrete. Computers don't understand infinity and have no way to represent it, they only care about data and how much of it there is. Discrete math should make a lot of sense to you if you already know some programming, especially in compiled languages such as C or Java. Linear algebra is part of discrete math and deals with vectors and matrices, which will seem familiar to you as arrays or lists if you have prior programming experience.

Probability is also very important to computer science since we often use computers to make predictions for us and to simulate randomness (computers are not random by nature). Predictions are made from data, so you'll be learning statistics with your probability since they go hand in hand.

Introduction to formal proof is about the language of logic; how to prove a hypothesis is true, how to reason and the fundamental fact that something is either true or false is something you'll use everyday in your work, no matter how informally. Learn this one while you're learning your basic Discrete Math. Discrete Math textbooks tend to have a chapter or two at the first part of the book on Logic, so it makes sense to learn them together.

The math is scaring you, I can sense it. There really is nothing to be afraid of. All the scary looking notations are really just shorthand to express something while taking less time to explain it. An example of scary notation is the symbol for summation: sigma.

If you are having trouble understanding the mathematical way of thinking about it but have a little bit of programming experience; you can think of it like this...

```
/* Naive implementation */
for (int k = 0; k < n; k++) {
sum += k;
}
/* ALTERNATIVE: The power of Number Theory */
sum = (n*n + n)/2;
```

That wasn't so scary, was it? A summation—as the root word of "sum" implies—is just a sequence of numbers added together.

If you need more motivation to learn math, there is a site called GradeSaver where you can submit your textbook answers for $1 US each. I earned about $50 US in a week thanks to me explaining my answers in more depth and submitting them to GradeSaver. GradeSaver pays you through PayPal, so make sure you have an account set up.

What you might be thinking is: "If a site like this exists, wouldn't all the questions already be solved?" There are hundreds of Textbooks with thousands of problems, each. Since people are lazy, they won't try to solve a lot of problems so that opens up a market for you. If you want to buy that sweet RTX 2080, you'd better get cracking. Go get em, tiger.

GradeSaver — https://www.gradesaver.com

Design and analysis of algorithms, functional programming, imperative programming and basic information theory are the topics you'll be learning on the programming side.

In university, students usually pickup about 5 programming languages:

- Java
- C/C++
- A scripting language (Ruby or Python).
- A functional programming language (Haskell or Clojure usually).
- Some form of Assembly language (x86 usually).

Typically, C/C++ and Assembly are not forced on you until you learn computer architecture, so you don't have to worry about them right now if you don't want to. MIT teaches their algorithms courses in Python because it's arguably the simplest, though others teach in Java. You will need to know both in the industry so learn which ever one you find the easiest to you for your algorithms.

Functional, Imperative, Procedural, Object-Oriented, and Compression-Oriented programming are all different styles of programming. Chances are in a job you'll be using procedural and object-oriented programming the most, so you can leave the rest for later or just not learn them. Learning these styles will make you a better programmer since it broadens your options on how to solve a particular problem. By the way, functional does not mean "working", it has to do with inputs, outputs and states of functions.

Here's a non-exhaustive reading list:

- Precalculus: Mathematics for Calculus (7th Edition), James Stewart
- Calculus: Early Transcendentals (8th Edition), James Stewart
- Discrete Mathematics (6th Edition), K. A. Ross and C. R. B. Wright
- Introduction to Linear Algebra (5th Edition), Gilbert Strang
- Probability and Computing (2nd Edition), Michael Mitzenmacher
- Logic in Computer Science (2nd Edition), Michael Huth
- Introduction to Algorithms (3rd Edition), MIT Press
- Might as well just learn Java on YouTube
- Python Crash Course (2nd Edition), No Starch
- Programming in Haskell (2nd Edition), Graham Hutton

Tim Roughgarden's Stanford Algorithms Lectures — https://m.youtube.com/channel/UCH4s4ek5zqNvct5oy9_jd_g

**Year 2:**

Your second year is where things get very interesting. After learning all the math and programming, you will now find applications for them. The core courses in your second year will be: algorithms, compilers, concurrent programming, and models of computation. These courses are crucial to your development as a software engineer.

Algorithms are the bread and butter of computer science. Learning how to design and analyze them will make you a much more effective programmer, rather than staying a code-monkey your entire life. Thinking about how to model data into certain types of data structures and operate on them using efficient algorithms is the essence of any software development job.

Your optional courses will be: computer architecture, computer graphics, computer networks, databases, and artificial intelligence. If you loved discrete math, take architecture, networks or databases. If you loved multivariate calculus back in year one; take graphics or AI. Or if you're an insane person like me, take all of them. All of these courses deal with the theory and implementation of different computing domains, they don't spend a lot of time teaching you how to use tools.

Essential Reading List:

- Introduction to Algorithms (3rd Edition), MIT Press
- The Algorithm Design Manual (2nd Edition), Steven Skiena
- The Art of Multiprocessor Programming, Maurice Herlihy
- Introduction to the Theory of Computation (3rd Edition), Michael Sipster
- Computer Systems: A Programmer's Perspective (3rd Edition), Randal Bryant
- Artifical Intelligence: A Modern Approach, Russell and Norvig
- Pratical SQL, No Starch Press
- C Programming: A Modern Approach, K. N. King
- The C++ Programming Language (4th Edition), Bjarne Stroustrup
- Some Intel or AMD Documentation for the instruction sets

**Year 3:**

Year three could be the final stretch for you if you don't plan on going deeper into a field to obtain a master's degree. You start to specialize in this year; many lucrative careers are presented to you. The one you'll probably always be required to take is Lambda Calculus. I recommend atleast reading a book or two on security. If you ever wanted to design your own programming language, there are courses available.

All of the course options are chosen about two or three at once. I can't explain all of these subjects or else the article will turn out 5 hours long and I'm not getting paid enough to do that.

Your options include:

- Computational complexity
- Machine learning
- Computer security
- Computer-aided formal verification
- Geometric modelling
- Knowledge representation and reasoning
- Lambda calculus and types
- Principles of programming languages

**Year 4:**

Year four is the year or your master's degree. If you don't want to continue and complete some of the topics listed below, you don't have to. By now, you should've learned almost everything this is to know that will be applicable in jobs or even in research. The courses available are very specialized and will contribute to you getting very high-paying niche jobs in the business sector.

The course options include:

- Advanced machine learning
- Automata, logic and games
- Advanced security
- Categories, proofs and processes
- Computational game theory
- Computational learning theory
- Concurrent algorithms and data structures
- Database systems implementation
- Probabilistic model checking
- Probability and computing
- Quantum computer science

None of these courses are compulsory, you learn what interests you and create a few projects with what you learn. You'll probably know a good amount already about the information contained within these courses, just not to the specialist level yet.

**Conclusion**

Teaching yourself a college degree is an incredible, challenging, and life-changing experience. Accomplishing such a feat takes a long time, though you are learning at an accelerated pace. You will build up a lot of self-confidence when you realize the magnitude of what you're doing for yourself. The only thing that this effort will cost you is time. No one is going to arrest you for reading free copies of books online and the companies that might want to hire you might not care what you used to get so good.

Here are a few sites that will give you programming problems to solve as practice:

HackerRank — https://www.hackerrank.com

CodeSignal — https://codesignal.com

CodeInGame — https://www.codingame.com

Telling a prospective employer that you know everything you do because you taught youself is very good for selling your character. Most modern software jobs expect you to be self-reliant and have the ability to pick up new concepts and techniques in a timely manner. Work on a lot of projects to help implement the concepts and present your work as a demonstration. I'm sure you can do this! Happy Hacking!