In this series of articles, I will write about different areas of computer science, programming, and software engineering and what resources can be used by all those who want to learn these areas. So, I write on how you can step into the world of programming without a CS degree or in other words, how you can get a degree online, for free, at a pace that suits you. ๐ป ๐งโ๐

In the first article, I write about the freshman year of study and the topics you need to learn to compensate for the first year of study in college.

# Introduction to Computer Science and programming

In this course, you should learn about the basics of the computer system, about bits and bytes, data types, how computer programs are executed (compiled and interpreted), conditionals, loops, and functions...

I would recommend one of these courses:

- Computer Science 101 (by Stanford)
- Introduction to Computer Science and Programming Using Python (by MIT)
- CS50: Introduction to Computer Science (by Harvard)

In my opinion, these are the best courses you should take for your introductory courses. Some of these courses are more general and you will learn a little of this, a little of that, and others are more uniform. I would go with Python as your first language (it's user-friendly, very useful and popular today, and above all - very easy to learn).

These courses push Python in front of you. What is certain is the quality of these courses - they're taught by the best instructors from the best universities.

**Note**: Besides learning CS principles and programming fundamentals, you should practice a lot. These courses tend to make you practice by doing assignments. I highly recommend you do them. Also, you can practice on some of the popular coding platforms: Codewars, HackerRank (Python and Problem solving tracks), edabit, etc.

It's very important to understand basic concepts and polish your basic coding skills. I have an advice: **code, code, and code**.

Also, a book I would recommend is Structure and Interpretation of Computer Programs ๐

# Math for CS

Many CS and ML beginners run away from math, either because they donโt like it or because they think you donโt need it for the world of computing. However, mathematics is an indispensable part of programming, computer science, and machine learning because it can be said that mathematics has laid the roots of computer science. You don't have to be a math expert to be a software engineer, but it's very important to be familiar with the basics. I would take a look at these topics:

- linear algebra
- basic calculus
- basic geometry
**discrete math**

For these topics check out these resources:

- Linear algebra course by MIT
- Single Variable Calculus by MIT
- Multivariable Calculus by MIT
- Khan Academy courses
- Mathematics for Computer Science by MIT
- 3Blue1Brown videos - good video materials
- Mathematics for Computer Science - book

# Algorithms and data structures

I find this topic extremely important. Mastering data structures (arrays, linked lists, trees, heaps, stacks and queues, hash maps, graphs) and algorithms (searching, sorting, dynamic programming, backtracking, greedy) allows you to write better and robust programs that are very efficient in terms of time and memory usage. FAANG companies in particular insist on knowing these areas in their interviews.

There are various resources to learn these things, but I'll list some of them that I find very handy:

- CLRS - the algorithms encyclopedia (you can find it on the Internet without buying)
- MIT's 6.00.6
- Stanford's Algorithms Specialization by Tim Roughgarden
- Prinston DSA courses - algorithms analysis, algorithms (part 1 and part 2)

Platforms to exercise algorithmic type of problems:

# Computer Architecture and Organization

This topic is a key factor in understanding how a computer system works, how data is stored, how the processor executes instructions, how memory works and what types of memory exist, how the process of working with input-output peripherals works, and so on. This topic can be studied at the level of engineering (electronics) or only with the approach of understanding. Some of the resources I would recommend:

Some good books about this subject:

- Computer Architecture: A Quantitative Approach
- Structured Computer Organization
- Computer Systems: A Programmer's Perspective

# Bonus: git and GitHub

Learn git - version control tool. Good starting point - GitHub learning lab.

## Discussion (0)