📜 ⬆️ ⬇️

Mastering programming - no problem

What is this article about


Attempting to explain why the study of modern technologies is difficult, how to find the easiest way to master them and become an expert.

image


Who is this article for?


In order not to disappoint the reader, you must immediately decide for whom this article is intended. First of all, this article may be useful for programmers who want to independently master the creation of software. It may be useful to teachers of programming. At the same time, she describes a point of view that may differ from the vision of professionals who have passed their way and have their own well-established understanding of things.
')
This article is also more research than strong recommendations. In view of this, it may require the reader to attempt to consider issues from the point of view of the author. Also having a direct relationship to learning this article may seem useless and boring when viewed from a production point of view.

Foreword


Although information technologies are very developed these days, their mastering and becoming a qualified professional continues to be difficult. The author, being an instructor coach, made several attempts to find his students the most convenient way to master programming and related topics. This article is an attempt to build a simple structured picture of this issue.

The author tried to write the article as simply as possible, to indicate the key principles of his vision and to offer a useful self-development strategy to specialists at all levels.

The author began using the C # language since its inception. Until this time, the author has gained rich experience in working with a variety of IT technologies - hardware, internal OS features, the language Assembler, C ++, COM, WinApi, networks, multithreading, etc ... These skills have essentially helped to master C #, as well as their new versions. But for beginners, training also requires them to learn a lot of new technologies from various unfamiliar areas, which makes studying a long and difficult process.

Greatest difficulty


The greatest difficulty arising from the study of something is the huge number of different technologies, as well as the industrial sectors where these technologies can be applied. Also, this number is constantly increasing (see the so-called "technological singularity").

Orientation in such a complex environment becomes very difficult. Simple rules, explanation and strategy would be very helpful.

Man, Tool, Problem


To understand many important processes and elements of the training system, the Human-Tool-Problem link can be used.

For the convenience of analyzing the problem, we take the following assumptions:


Complexity of Problem and Tool


Different problems have different difficulty solving. Accounting for the family budget is a much simpler task than managing the delivery of goods around the city.

To simplify the explanation, we can consider the complexity of the problem only as the complexity of its solution. The complexity of the tool, in turn, can be considered as the complexity of its use by humans. The simpler the tool, the easier it is for a person to use it.

Various tools can be used to solve one problem. For ease of use Tools can be divided into groups:


Difficulty of Use


For a person, ease of use of the tool is most important. The complexity of the tool can lead to delays, poor quality results, and the impossibility of solving the problem. It goes without saying that the lack of a tool can be the cause of the complete impossibility of solving a problem (We don’t consider a solution without a tool - this is the rank of the simplest problems). Thus, when creating a tool, the main criterion is ease of use.

The complexity of something for a person can be classified as follows:


Low, High, and Super High



The evolution of programming languages ​​has led to an increase in the level of abstraction of programming languages ​​from the hardware platform:
  1. Low-level languages ​​are convenient for hardware implementation, but difficult for a person due to the large number of commands that perform the simplest operations;
  2. High-level languages ​​are convenient for human understanding, which allows you to develop programs faster. But these languages ​​are difficult to implement for hardware implementation, which generally leads to slower code and greater resource consumption;
  3. Very high-level programming languages ​​(VHLL) are programming languages ​​with a very high level of abstraction. Unlike high-level programming languages, where the “how to do” principle is described, in the super-high-level programming languages ​​only the principle “what needs to be done” is described.


With the normal development of programming languages, their level corresponds to the level of abstraction from the low hardware level. With increasing abstraction complexity of use should not increase. However, in reality, it can be difficult to understand. Increasing the level of abstraction is almost always associated with the creation of large structures that hide the complexity inside and give the simplicity of their use from the outside.

But for correct use in order to avoid negative side effects, the developer needs to know the internal structure of the structures. So when using sockets in a network application, you need to know the appropriate network protocols and how networks work. Without their understanding, it is unlikely to write a quality product in reality. That is, increasing the level of abstraction simply hides the complexity inside, but does not eliminate it.

The evolution of programming languages ​​shows their constant improvement, but over a long period of development has not simplified their understanding. It should also be mentioned here that the range of problems solved by IT has significantly expanded - therefore, they remain complex.

This evolution is not an easy process. However, some features may help to understand this process:


The complexity of programming languages


The complexity of modern programming languages ​​is the result of the following main factors:


Upper-Level Languages


The described evolution of programming languages ​​has led to the emergence of large components with a large number of properties. The development of high-level languages ​​is based on low-level languages ​​(for example, compilation from high-level to low levels is used) by integrating small components (commands) into larger structures. Among other things, the described processes have inertia, which ultimately translates the programming language from a high level further to the so-called Super-high.

As noted, the growth of the level of abstraction leads to the appearance of large structures (elements of the language, functions, libraries, etc.) that hide the complexity in the internal implementation. However, to create a high-quality product, it is necessary to know the internal implementation, operating time, consumed memory and other properties of the structures used. This leads to a shift in complexity above from being convenient for the developer, as shown in the following figure.

The figure shows the increase in complexity with a large number of simple elements or properties of elements. As you can see tasks with a lot of simple elements, the corresponding low-level languages ​​are convenient for execution by a computer. Tasks with components with multiple properties, in turn, are difficult for a single developer, but can be more easily mastered by a group of developers.

image


Strategy


First level


The easiest to learn programming level is the level where the number of components and properties of these components is convenient for the developer to understand. Typically, these components reflect simple popular operations — arithmetic operations, processing lines of text, input / output of simple data, and so on. Most books begin the story from this level.

At the initial stage, the most important thing is to understand the question - “what's next?” This is a key tactical question, which allows you to see your development from the current point further. The question “what next?” Can arise in two important cases:


If the developer is stuck on any topic, he should change the direction (vector) of the study - find another way to study this topic or choose another topic to study. If the developer is faced with the problem of choice - he just has to make a choice. That is, you can not stop.

After mastering the entry level, the developer can make a choice of further development in two main areas:


Low-level programming


Low-level programming is hardware-friendly programming. Mastering system programming requires learning low-level languages ​​and a platform. The complexity of learning low-level languages, in turn, requires the study of a large number of small simple elements and ways of organizing them in a computer system.

Low-level programming is a specific approach. The developer must decide to follow this direction. This is also a trend rarely chosen by developers.

High-level programming


High-level programming - programming, with the help of which software is usually created that automates major human life processes. It is aimed at solving applied problems, without worrying about the optimization of the equipment operation.

Such systems use high-level languages. The complexity of the study here includes the study of larger (as compared with low-level programming) components of the language and a certain number of their properties. So for example, developers need to know the internal structure and properties of containers (array, stack, hash table, ...) in order to apply them without negative side effects (high memory consumption, slowdown, etc.).

The development of high-level languages ​​leads to an increase in the "size" of the constituent components and, accordingly, the number of their properties (both external and internal). The complexity for the developer increases both in the need to study these components and their properties, and the need to keep track of the constant appearance of new components and versions.

Organization


The problems described above are not intractable. However, if you do not take the right action, you can go to a dead end. Many actions are known and clear. The above description allows you to understand the effectiveness and necessity of these actions:


Recommendations


Summing up we can highlight the following important facts:


And most importantly, without the love of programming and the desire to work hard, learn programming and become a professional will not succeed. Even in the absence of talent, with perseverance you can achieve some results and find your place in a wide range of IT.

Source: https://habr.com/ru/post/302556/


All Articles