📜 ⬆️ ⬇️

Classification of knowledge in the field of programming

2 years ago I wrote an article on the classification of knowledge in programming. It was on a wave of interest and my active self-education in computer science. Wrote an article and forgot about it. To publish on Habré was not going to. In the end, it is based on my personal experience and knowledge, which can be very subjective.

Recently, against the background of constantly coming questions “how to learn programming?”, I remembered this material and reread it. 2 years have passed, experience has been replenished, knowledge has been added, views have changed. But this article for me has not lost relevance, and I have not found almost anything I would like to change in it. It seemed to me that it is still worthy of publication. And, perhaps, it will help someone in their own professional development.

But before "launching" the material, there is still a slight digression. About why I wrote all this at all. The fact is that in our countries of the former USSR education in the field of IT is very difficult. On the one hand, there are no training programs that will train specialists at the proper level (probably, with very few exceptions, which can be attributed to error). On the other hand, because of the wide possibilities of self-education, programmers are not in a hurry to study in universities - everyone wants to start practicing as soon as possible. Often only one direction is studied (for example, PHP + Mysql is the most popular) and into battle. Moreover, this all ends. As a result, we have a huge number of programmers who do not even know basic things. This results in problems with the quality of the code, and with the efficiency of algorithms, with cycling.
')
But programming is a full-fledged area of ​​knowledge, which requires including engineering training. Just like construction or telecommunications. Yes, you can build a house (mansion) with your own hands and without education. And you can raise most sites by reading a couple of books on PHP and HTML. But you can't build a high-rise building without special training, just like you can't write Google without knowing the basics.

The possibilities for self-education in computer science are now enormous. The only thing missing is the systematic preparation. How to figure out what and in what sequence to study? It seems to me that this material will help decompose in the fields of knowledge in computer science and create a study program for yourself on books. The choice of books is a separate topic, is not included in the scope of the article, but this can be discussed in the comments.

Go.

People sometimes ask me what to learn in order to become a programmer. The question is somewhat naive, because normal answer to him is impossible. Those. First you need to figure out what kind of programmer you need to become. Anyway, whether a programmer? In addition, the market is in demand as highly skilled and expensive professionals, and “labor”. The package of knowledge and experience of the first and second differs to a great extent.

But, despite the vagueness of the question, it is still possible to answer it. You can describe the approximate maximum of knowledge that one way or another related to programming. Actually, this maximum is usually sought by students in higher education institutions on specialties, in whose name the word “programmer” appears.

I studied as a programmer in college, then at university. It was the university that put some understanding and interconnection of disciplines related to the so-called computer science on the shelves. Let the knowledge that they gave there were narrow-minded and a bit outdated, but their systematic approach was quite good. After years of practice after graduation, I came to the conclusion that the university classification of disciplines is quite good and allows you to answer the question of what any programmer should know.

Of course, to know everything is impossible. Yes, and not necessary. In addition, some questions need to know deeply, while others have a rather superficial overview of understanding. Therefore, depending on the specialization, some disciplines are more relevant, some less. But general basic knowledge is needed in almost all of them for any software engineer, from a systems analyst to a web developer.

In the previous paragraph, I specifically introduced the term “software engineer”. Somehow it turns out that a programmer is not necessarily an engineer. Even from the definition of Wikipedia, it follows that an engineer is first and foremost a designer. This is the one who creates, i.e. designs systems. But in programming practice, designing is not always necessary. Sometimes coding is enough: using a given set of technologies, to blind something working. A typical example is a herd of corporate or marketing sites on Jumlah, Vorpress, Drupal, etc. This is a technician level, not an engineer. This is the level of secondary education. And you can work as a technician even after completing the courses of a programming language, a strong theoretical base is not needed there.

And, returning to software engineers, I want to offer my graph of disciplines that programmers are studying. Obviously, some disciplines are actively using the knowledge of others, or grow out of others altogether. Accordingly, for a complete understanding of the “upper” object, some level of understanding of the lower one is necessary.

The graph consists of subjects (disciplines) and is divided into levels. The lowest - General base - in general has no relation to computer science. It is given only to show what the disciplines of computer science are based on.

There are 2 types of connections between disciplines: use (normal arrow) and expansion (arrow contour). Use implies the need for fragmentary knowledge of another subject, and expansion means the need for at least a review, but complete knowledge of an expandable discipline.

The first level of CS (computer science) - Special base . This is the starting point for any programmer on four fronts:

  1. computer arithmetic bases (number systems and operations with numbers, logical operations);
  2. physical fundamentals of a computer (semiconductors, transistors, logic elements, circuits, integrated circuits);
  3. theory of algorithms (algorithms and data structures; complexity, efficiency; methods of presenting information in memory);
  4. programming languages (the problem and the concept of PL, levels, types of languages, abstraction, levels of abstraction, translation / compilation, patterns, principles, paradigms - an overview).


A special base offers fundamental theoretical knowledge on which higher-level disciplines are built. An average programmer needs review knowledge in all subjects of a special database. For some specializations, an in-depth understanding of the theory of algorithms is required (first of all, to developers of various kinds of libraries).

A level above are disciplines that are basic in programming. That's why I called this level of Basics . It includes:

  1. computer architecture (processors, microarchitecture, memory, buses, input / output);
  2. information processing ( information theory, statistics, models, data retrieval, linguistic aspects, information processing by means of tabular processors);
  3. C / C ++ fundamentals (basic language properties, syntax, pointers, input / output, arrays, STL fundamentals).


Behind the Basics is Level 1 . This is the first application level, and especially impatient people can begin commercial practice, having mastered this level. It includes 5 disciplines:

  1. the basics of ASM (development of computer architecture in the direction of programming, writing the simplest drivers and algorithms, assembly inserts in C / C ++);
  2. C / C ++ (OOP, application development, libraries, WinAPI, make utils, parallel programming).
  3. operating systems (OS architecture, processes, interprocess communication, threads, scheduling, work with memory and peripherals, POSIX systems);
  4. system analysis (subject area, business processes, flows, charts, principles and theory of system analysis);
  5. databases (set theory, types of DBMS, relational DBMS, data models, SQL, specific databases).


The next level - Level 2 - develops the previous one. By the way, computer networks got into it only for the reason that to study them it is desirable (but not necessary) to pre-master operating systems. In terms of development, this subject is nevertheless closer to the first level.

Level 2 includes:

  1. software development ( software life cycle, development stages, basic software project management, tools);
  2. data analysis (Data Mining, OLAP, machine learning, neural networks, AI);
  3. computer networks (by TCP / IP and / or ISO / OSI “from and to” stack levels, protocols, C / C ++ network programming);
  4. managed code programming languages (managed code, virtual machines, garbage collectors, unit testing, actual C # or Java practice);


Level 3 is the last level for the average programmer. It is the most voluminous and includes only those disciplines that are directly related to software development. In total, they turned out 6:

  1. development of UI and usability (principles of building user interfaces);
  2. management of teams and projects (development methodologies and other management issues);
  3. software testing (overview: types of testing, tools);
  4. web technologies (HTTP protocol, web server, CGI, caching and proxying, client programming);
  5. distributed systems (architectures of distributed systems, protocols of network interaction of components, tools, principles, approaches to the construction of distributed systems, fault tolerance, big data, high loads);
  6. interpreted programming languages (features, fundamentals in two or three languages, practice in one or two languages: JS, PHP, Python, Ruby).


Everything that goes higher is advanced Expertise . By and large, this level can be expanded without limit, adding to it related disciplines and the most difficult aspects of software development. I gave 3 examples - the development of compilers, the development of operating systems and the construction of architectures of large software and hardware systems, or architectures designed for particularly high loads. Dependencies to the lower levels of the graph did not draw the graph, since there will be too many arrows going through all the levels, right down to the Common Base. Probably, wide dependencies are one of the signs of expert questions. Here it is just confirmed that the expert level requires the most extensive knowledge and good experience.

The interesting thing in the graph is that it not only shows the preferred order of studying subjects, but also:

  1. makes it possible to understand which disciplines are needed more, which less for working in a particular specialization (just choose the main subject of specialization and look at connections and distance to others);
  2. gives an understanding of how to study computer science, if you start not from the fundamentals, but from applied knowledge (for example, PHP) - you can move along the connections to the sides and downwards - actually this was my personal development path (and I can’t call it the easiest, most effective and optimal).


A graph is a model. A good model usually gives answers to many questions at once. I set myself the task of making a good graph, close to reality. Naturally, it is based on my personal experience and does not claim to be ideal. I tried to make it the most objective. And once again I remind you that this is a graph for a programmer. Those. for the tester, sysadmin and other professions close to programming, it will be more or less close, but obviously different.



PS You are kindly requested not to develop holivars on what the programmer should and should not know. This is a personal choice of each and the article is not about that. Here is a classification of knowledge and mutual knowledge between them. This is not all interesting, not everyone needs it.

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


All Articles