If you want to study systematically. Tell me what I think. You have to have a goal, learn something, and you become an introduction. Don't say what you are proficient in. There is no first place in literature. When you say you are proficient, there will always be big cows who will stand up and despise you.
Then what is the introduction? My understanding is that when you see an existing program and think about it with your head, you can get a general idea of how it is implemented. Of course, you don't have to fully understand it. Impossible, but it won't be thoughtless for you to write a similar program according to this program. At this point, you are almost getting started. To put it bluntly, imitation is the first stage of learning. No need for innovation. You just need to look at the existing things and imitate them. Only by knowing how to imitate can we go further. But this imitation is not for you to copy according to the code, but a black box. Not exactly, as long as you have a general idea and it can be realized.
So in order to achieve this introduction, you need a series of systematic learning. Like those who learn by example, they can only learn the surface. There is always something you haven't seen, so you need to learn the essence, not the principle. Of course, it is possible to go from shallow to deep through examples, but we can't give up the foundation.
Programming and theory are two lines, but they go hand in hand. Many beginners don't know how to learn, so regular classes are necessary, at least practical.
So I'm talking about this learning process. First, you have to choose a programming language. If you are the kind of person who is willing to bear hardships and stand hard work, I suggest you start with C. Why do you say that? Because C is low-level, you want to use C to develop some interesting programs, especially those with GUI, which is not wishful thinking, at least very tiring. However, the advantage of C language is its simple grammar. After learning C well, the data structure and algorithm can be realized all over the world, and can be used to learn OS in the future, which is a relatively common set of languages in the learning process. If you are eager for success and want to do some meaningful small programs in a short time, learn Java. There are many libraries in Java, so it is easier to write programs in GUI. Besides, sooner or later, you have to have the idea of OO.
At the same time, I studied theories, such as discrete mathematics, computer structure, data structure and algorithm, one by one.
At this time, you can learn assembly and machine language. This is not to say what you want to do with assembly, but to let you know the working principle of CPU, and then try to design a CPU by yourself with or, AND, xor and other originals. I'm not asking you to actually make a physical CPU, just draw a circuit diagram. When you understand the working principle of CPU, you will feel suddenly enlightened. It turns out that computers are so exquisite.
After that, you can start learning the principles of the operating system. At this point, you can install a Linux and be familiar with those system calls. Study the file structure or something. Envy those predecessors who knock in the shell every day? In fact, these are not difficult at all. When you get familiar with them, you will think that windows is too unsuitable for programming. Many people say that Windows is a good program and VS is an IDE artifact or something. But if there is no VS, will anyone write programs in Windows? So they say VS is better than Windows, which is just an accessory. Linux is much more casual. For languages like C, when there is no lib available, there is no IDE. But for a perverted language like Java, I would never write it with software like VIM. I'm exhausted.
When learning the system, you should learn parallel processing and thread control, such as parallelism and concurrency. The CPU of a computer has only a few cores, even a single core. But computers run so many programs at the same time because of the parallel processing function of OS. It is very useful to learn these well.
There are many things to by going up one flight of stairs. The network can learn those protocols such as TCP, UDP or HTTP, and then try to write a simple server in C to listen to a port and send some information. You can also write in Java, which is simpler than C, but C is closer to the system because Java uses virtual machines. After all, there is a layer apart.
If you are interested in 3D images, learn OpenGL. C is enough for a simple small program. If it is too complicated, you should learn C++. Anyway, I really don't like C++. Although powerful, it is too tiring to develop, especially after learning Java. Do you think C++ can be so troublesome? But if you want to do the bottom development, you have to learn C++. So it depends on your own position. If you don't really want to go deeper, C is enough. After learning OpenGL, you can appreciate the advantages of Linux. Just find some orders from the internet and type them out. When I was in the graphics class, I finished my first homework, and those students who used Windows were still studying the configuration environment. When they thought that the advantages of VS would be reflected after the first configuration, they tragically found that one or two new LIBs would be used in every assignment this semester. So they can only look at me gloomily while drinking coffee and typing the code.
There are too many branches of the computer, and there are still many things to learn, such as databases. In fact, the database language is very simple. Learning MySQL can give you a general idea. At the same time, you can learn web development, front-end html+css+js, and too many back-end options, such as traditional PHP. Learn Java well, and then learn JSP. Regardless of Microsoft, Python is also good.
Speaking of it, it is also necessary for you to learn a scripting language. Python is a common choice. After learning python, you can compare C, Java and Python, and you will find that the lower the language level, the less its functions, but it is convenient to realize those infrastructures, such as data results. The more advanced the language function, the more everything is ready-made, but the basic things are hidden. This is why python and java with 10 lines need to write 30 lines or more. But the underlying language is faster. When you get used to the development efficiency of Python, you can get in touch with other languages, but that doesn't mean you don't have to learn from scratch, otherwise how can you understand the principle?
If you speak programming languages, you must learn compiler development. Compiler is a wonderful thing, but it can't be explained clearly in one or two sentences. It is also very practical to buy a book and study it yourself.
It is almost enough to learn basic things here, but there is no end to learning. Since CS is a science, it will never end, but after you know and understand the basic knowledge, all new knowledge will not be too difficult to learn.