This is a general outline and guide on how to get started learning Computer Science. Becoming a computer scientist is a long path that will require dedication and effort. This is not a definitive guide. It is a way to help you in the right direction if you are sincere and serious about learning Computer Science. There is no quick and easy path to mastery, but that doesn’t mean it can’t be interesting and fun along the way.
Programming is an essential tool for any computer scientist. It allows us to take what we know in theory and make something real out of it by expressing it formally and by being able to run it on a computer. This is one of the things that make computer science so exciting: you are able to apply the theory you learn to create something real.
Although it is important for you to learn how to program on your path to becoming a computer scientist, what is more important are the underlying principles that all programming languages follow. You do not want to spend all your time learning one specific programming language. You want to understand in general what a programming language is and what it does. At that point, you will easily be able to pick up a new programming language. Not only that, you will also be able to understand why the language works like it does. Furthermore, you will also know if it is a good language for the task at hand!
You may be wondering what language you should start out with as a beginner. The truth is, it does not matter so much, as much as some people might lead you to think. However, here are some of the things you should look for in your first programming language:
- Popular (so that you can easily find help and guides online).
- General-purpose (so that it can be applied to a wide range of problems).
- Understandable (because you don’t want to learn Brainfuck as your first programming language).
If you are in doubt, I would recommend picking up the Python programming language. It has a huge amount of online learning material, it is fairly simple to learn, and it is very capable of being used in real-world programming scenarios. But if you want, you can use C, C++, Go, Rust, D, Ruby, or whatever you have in mind. Just try to evaluate why you are choosing a specific programming language (something you will become better at over time). With that said, you don’t have to pick a single programming language. It is good to experiment with different languages, but make sure you learn at least one language well.
If you already feel confident in your programming abilities you can skip along to the next section.
Steps to take
- Choose a programming language and learn how to use it well enough to create basic programs. If you are in doubt, go with Python. Use whatever learning style works the best for you. It can be books, videos, or online guides, it’s up to you. Check out what your programming language has to offer, you’ll be surprised with the wealth of information out there for free. If you are using Python, I recommend that you start out by going to the Python Beginner’s Guide.
- Get comfortable with programming by creating some of your own applications. It doesn’t have to be anything large or difficult in scope. In fact you should try to avoid creating something that will be too difficult to finish. You can make a small game that uses the command line (like tic-tac-toe), you could make a program that scans a webpage for information (easier than it sounds), or anything else that intrigues you!
If you decided to use Python and you want to learn by reading a book (completely optional, though I prefer this style of learning myself), I would recommend “Python Crash Course” by Eric Matthes. If you want to learn more of the Computer Science fundamentals with Python then you should check out “Python Programming: An Introduction to Computer Science” by John Zelle.
Algorithms and Data Structures
Algorithms and Data Structures lie at the heart of Computer Science. It is how we solve and structure the problems we are dealing with.
Algorithms are deeply embedded in almost every software application you can think of. It is essential that you understand them and know how to implement and create your own algorithms. Algorithms specify how a problem is solved, like when you need to sort numbers, figure out the shortest path from point A to B, or have any other such problem you might face in the real world.
You have to learn topics such as asymptotic analysis and Big O notation which we use to classify the running time or space requirements of algorithms. Knowing about Big O notation and how different algorithms are classified, you will be capable of making intelligent decisions about what algorithms to use, as well as helping you optimize the algorithms you will be creating yourself.
Data Structures specify how data is structured. Do we store the data in a list, a tree, a hash table, or a whole different kind of structure? It is your task to be able to evaluate which type of structure is most fitting for the problem at hand.
Being able to manage data in a fast, reliable, and compact manner is often crucial to building large applications. You are going to benefit greatly from knowing which structures fit certain types of problems, and to be able to create your own data structures when necessary.
It is not rare for people who are first getting into programming to want to skip these topics. Of course, it is possible to program many things without formal knowledge of algorithms of data structures, but learning these topics in-depth is going to allow you to take your programming skills to the next level.
Steps to take
- Do the free online MIT course on Algorithms. Do the problem sets listed in the course and follow along with the book used in the course: “Introduction to Algorithms”. If you want something a bit on the lighter side you can check out Problem Solving with Algorithms and Data Structures Using Python. It uses Python to teach you Algorithms and Data Structures and it is more manageable to get through due to its more forgiving length (~440 pages).
- Apply your knowledge. Now that you have a foundational understanding of algorithms and data structures, it is time for you to start implementing more of them yourself. Set out to solve an interesting problem and work towards solving it with the use of some known algorithms. Here are some problems one might choose to take on:
- A program that finds the shortest path from one point to another (look up Dijkstra’s algorithm).
- Your own (simple) database system that supports standard read / write operations.
- A program that generates images of fractals.
The list could go on, but I encourage you to come up with an idea that you find interesting!
The Mathematics behind Computer Science
Computer science is in large part founded on mathematical principles. Please don’t let this worry you! Even if you don’t feel particularly confident in your math skills, you will be able to learn what is necessary as you go along.
I encourage you to study the mathematics as you go along on your journey. Read and study the topics and concepts that are relevant to you at the time. If there is a concept you are struggling with, look it up! Of course, it helps to have some foundational background in mathematics, but if you don’t have that you’re just going to have to work a little harder until you’ve picked it up.
The mathematical topics that are relevant to Computer Science depend on what area you are studying. In general, discrete mathematics is very relevant to the foundations of Computer Science. It deals with mathematical structures and their properties, which is a central part of what we study in computer science.
As you go out into the different branches of Computer Science, the mathematics needed to understand topics will of course be different as well. For example, Machine Learning and Computer Graphics requires knowledge of Linear Algebra, but is not necessarily needed for other topics. You cannot learn everything at once, so it is recommended that you try to learn the math that will aid you the most in the topics you are currently studying!
Compilers and Language Design
Compilers translate the high-level code we write (like C or C++) into a lower level language that our machines are capable of understanding. Not only that, we also benefit from compilers because they are able to optimize our programs to run more efficiently. Many of the implementation details of modern processors are abstracted away when we code. It is the job of the compiler to make use of these details in an efficient and reasonable manner. Compilers are also able to check our code for errors before running them, which is indispensable to debugging our programs.
So, what is the use in understanding compilers? It may seem like archaic concepts that you should not have to worry about anymore, and for most developers that may very well be the case. But if you dig deep and learn about compilers it is going to make you a better programmer and computer scientist. When you understand how your code is translated into machine language, you will be able to write more effective code, as simple as that. You will be capable of creating and using debugging tools which can assist you in development and in understanding a particular problem. But perhaps the most exciting reason is that you will be able to create your own programming language! Creating your own programming language (or implementing a compiler for an existing one) can be a fun and rewarding project to gain experience with compilers.
If you are going to create your own programming language, it is essential to understand programming language theory as well as compiler theory. Programming language theory, as Wikipedia puts it, “deals with the design, analysis, characterization, and classification of programming languages and their individual features”. This is going to help you understand the design choices of different programming languages, and also in being able to design your own.
Operating Systems Architecture
The operating systems on our computers are crucial to how our software applications function. Most of us take the operating systems we are relying on for granted. It is surprisingly little we would be able to do without the aid of an operating system. We almost never just run our applications straight on the hardware. We need some abstraction layer to take care of basic functionality such as rendering graphics on the screen, I/O (reading and writing to disk, keyboard and mouse, and so on), networking, user permissions and security, managing processes, and the list goes on. These functions (and many others) are what an operating system (OS) aims to provide.
Knowing how operating systems work under the hood is going to give you a better intuition about what is going on when your software is running on a computer, and it is going to allow you to design your applications around those features and limitations present in the operating system.
Once you have come to understand how these operating systems function, you might feel compelled to try to create your own. If you are feeling up for a challenge, this is definitely recommended! Creating your own modern operating system with all of the aforementioned features is an unrealistic goal for a single individual (and still yet a lofty goal for a skilled group of people). However, it is possible to make a simple operating system that supports just some of the basic functionality present in an operating system. Creating your own operating system is a brilliant opportunity to learn more about operating system architecture, and also a way to train your programming abilities. It will force you think about the details of the hardware and how to write code that deals with it in a more direct manner. Efficiency and accuracy are really going to matter here.
Steps to take
- Go through the free online guide “The little book about OS development”. It will take you through the creation of a small x86 operating system.
- Study the book “Modern Operating Systems” by Andrew Tanenbaum. As usual, this is a long and technical book and it can’t be expected that you read it from cover to cover. The first 6 chapters cover the most essential topics and reading just those will provide you with a good foundation for further exploration of operating systems. You can go through these chapters as you work to implement the concepts into your own operating system.
As a computer scientist you should understand how communication between computers work. At some point, you will likely have to work on an application that needs to communicate with the outside world. It is important for you to understand the underlying technologies and concepts that allow applications and devices to communicate with each other.
There is a vast amount of use cases for digital communication: websites, email, streaming, cryptocurrency and blockchains, social platforms, video games and interactive media, and many others. It is crucial to be capable of developing applications that can securely and efficiently transfer data over a computer network, and it is often the job of the computer scientist to assure that this will work.
Steps to take
- Take the free online Stanford course “Introduction to Computer Networking”. The course is going to teach you how the internet works along with the different technologies and concepts that allow applications to communicate with each other.
- Decide on a project where you are going to implement an application that in some way uses sockets, internet protocols, or other means of digital communication. I encourage you to come up with your own project, but here are some ideas to get you in the right direction:
- A chat application with both a client and a server
- An online video game with an accompanying game server
- Your own peer-to-peer cryptocurrency protocol and implementation
Hopefully this learning path has taught you what you need to do to become a better computer scientist. We hope you stay on the path and keep on learning. If you have any questions or suggestions feel free to leave a comment below!