About coders, programmers and software engineers
Recent articles on Habr " Who is a programmer? " And " Why Python is so good at scientific calculations " prompted me to this post .
Reading the comments to them, I repeatedly came across discussions with the division of developers into “coders”, “programmers” and “software engineers” and other labeling.
All this led me to certain thoughts, some of which I had already stated in the comments to one of the posts, and now I decided to supplement and arrange as a separate publication.
Take a look at the story. How and why did the computer and the first programs appear? To speed up and improve the accuracy of mathematical calculations and algorithms. Cryptographers wanted the ability to brute force thousands of combinations to decrypt secret messages, the military wanted the ability to quickly and accurately calculate the flight paths of artillery shells and missiles, the builders wanted the ability to calculate the strength of structures with different source data, etc.
In turn, the process went something like this: first, the subject area is examined, the algorithm is thought out, calculation formulas are derived, and then the whole thing is translated into software (machine) code.
The people who did everything except the last point were “engineers,” the people who translated the algorithm outlined in the form of mathematical formulas, flowcharts, or natural language were “coders” (or, then, just “programmers”).
Years passed. The technique developed, higher-level languages appeared, and OS appeared. “Coding” has become simpler, and engineers and researchers who have derived formulas themselves could already state them in a programming language, compile and debug them. There were people who combined both positions in themselves, and they were "software engineers." So far, everything is ok too.
And then the fun began. Computers and microcontrollers penetrated everywhere, from large data centers to handheld devices. The scope of their use has also expanded significantly - not only scientific and engineering applications, but also information systems, document management, communications, entertainment and games, etc.
The complexity in the "algorithmic" and "scientific" plan in a very large number of tasks (if not even in a predominantly large) began to decrease, however, the software products began to grow in complexity and functionality, the number of technologies and libraries increased, programming languages began to become more complicated again, and a serious criterion for evaluating the quality of software was not only “to work”, as before, but also “to be optimally implemented, had a well-thought out extensible architecture, readable code and documentation, etc.”. And the “programmer” turned from a “translator from human to computer” into a “software engineer” - in other words, if you compare programming with construction, any collective farmer can build a shed, but a skyscraper or a bridge so that it still stands for a long time is far from any.Do not confuse software development and programming . ”
And then another change happened, already managerial and social. As in the 90s, everyone realized that when programmers are developing UI / UX, they often get something terrible, like this:
and in the end such a separate profession as a UI / UX designer. A little later, everyone realized that demanding to combine both a professional in the field of software development and a professional in some subject area is difficult and expensive. As an example, look at 1C ' nicknames (sorry, I don’t want anyone about go, I have a brother, former 1C'nik) - in theory this should be a programmer-accountant, but in fact it turns out an under-accountant and an under-programmer.
This brought problems to both employers (for example, it is not easy to find a specialist expert in the field of trading on the exchange, and it is not easy to find a professional in the field of software development, and the likelihood of finding a person who combines both of them, respectively, is much lower), problems this brought the employees themselves in the same way (there may be ten companies in your city where java-signors are needed, but each has a different specialization in the subject area), and brilliant thought came to some bright minds: analyzing the subject area, formulating TK, and about what one person should do (business analyst, manager, technologist), and another person (programmer) to develop software to get the result.
Everyone was in the black. And this is good, and more and more companies are now working on this model. Just look at the resume on the headhunter sites - they are looking for exactly the "Senior developers of the microservice Java backend" or "ReactJS Middle developer", and "knowledge of the specifics of the banking sector" or "industry experience XXX" in Wishlist is indicated at best as "will be a plus ".
True, the concept “one writes algorithms and the other encodes them” has changed a little - on the one hand it has become easier, because in 90% of tasks today it’s more important not to invent a new algorithm or data storage structure, but to choose and make optimal use of existing concepts, or their modification for specific cases. But even without the "creation of algorithms" it is impossible to work in principle, because no one already formulates tasks of the form “allocate an array, make a loop for the passage element-by-element, etc.” (this is only encountered at school in computer science lessons), now the developer is working with information on “what is and what should be obtained”, developing a sequence of actions . In fact, even an elementary SQL query is already an algorithm.
That is why we can say that the division into " coders " and "programmers ”became obsolete 20 years ago, now these concepts are blurred and separation does not make sense.
But here, all the same, I want to somehow separate those who simply “invented the algorithm and expose it in the form of code” and those who are engaged in “software development”.
And here the old division comes in handy again. The one who simply invented the algorithm and writes code on it will be considered correctly enough to be a “ coder ”, but the one who is engaged not only in the creation of the algorithm and coding, but also in writing tests, documentation, elaborating the architecture and API, takes care of readability and reliability code, and takes part in many other processes, can be considered a " programmer ".
And what about the " software engineers"? As I said at the beginning, unlike in the old days, software development is not limited to engineering and technical tasks, and everyone who works with computers is no longer required to have a higher technical education. Nowadays, except for a" software engineer "and" mathematician “programmer” can be “chemist-programmer”, “financier-programmer”, “gamemaster-programmer” (role players will understand), and even “musician-programmer.” That is, in fact, this concept only indicates the scope of human tasks for what it is he has been programming.
And considering ka often the case in software development in the field of engineering:
and scientific activities:
If someone wants to offer other interpretations and names, I will be glad to see open and substantiated comments.
Reading the comments to them, I repeatedly came across discussions with the division of developers into “coders”, “programmers” and “software engineers” and other labeling.
All this led me to certain thoughts, some of which I had already stated in the comments to one of the posts, and now I decided to supplement and arrange as a separate publication.
Take a look at the story. How and why did the computer and the first programs appear? To speed up and improve the accuracy of mathematical calculations and algorithms. Cryptographers wanted the ability to brute force thousands of combinations to decrypt secret messages, the military wanted the ability to quickly and accurately calculate the flight paths of artillery shells and missiles, the builders wanted the ability to calculate the strength of structures with different source data, etc.
In turn, the process went something like this: first, the subject area is examined, the algorithm is thought out, calculation formulas are derived, and then the whole thing is translated into software (machine) code.
The people who did everything except the last point were “engineers,” the people who translated the algorithm outlined in the form of mathematical formulas, flowcharts, or natural language were “coders” (or, then, just “programmers”).
Years passed. The technique developed, higher-level languages appeared, and OS appeared. “Coding” has become simpler, and engineers and researchers who have derived formulas themselves could already state them in a programming language, compile and debug them. There were people who combined both positions in themselves, and they were "software engineers." So far, everything is ok too.
And then the fun began. Computers and microcontrollers penetrated everywhere, from large data centers to handheld devices. The scope of their use has also expanded significantly - not only scientific and engineering applications, but also information systems, document management, communications, entertainment and games, etc.
The complexity in the "algorithmic" and "scientific" plan in a very large number of tasks (if not even in a predominantly large) began to decrease, however, the software products began to grow in complexity and functionality, the number of technologies and libraries increased, programming languages began to become more complicated again, and a serious criterion for evaluating the quality of software was not only “to work”, as before, but also “to be optimally implemented, had a well-thought out extensible architecture, readable code and documentation, etc.”. And the “programmer” turned from a “translator from human to computer” into a “software engineer” - in other words, if you compare programming with construction, any collective farmer can build a shed, but a skyscraper or a bridge so that it still stands for a long time is far from any.Do not confuse software development and programming . ”
And then another change happened, already managerial and social. As in the 90s, everyone realized that when programmers are developing UI / UX, they often get something terrible, like this:
and in the end such a separate profession as a UI / UX designer. A little later, everyone realized that demanding to combine both a professional in the field of software development and a professional in some subject area is difficult and expensive. As an example, look at 1C ' nicknames (sorry, I don’t want anyone about go, I have a brother, former 1C'nik) - in theory this should be a programmer-accountant, but in fact it turns out an under-accountant and an under-programmer.
This brought problems to both employers (for example, it is not easy to find a specialist expert in the field of trading on the exchange, and it is not easy to find a professional in the field of software development, and the likelihood of finding a person who combines both of them, respectively, is much lower), problems this brought the employees themselves in the same way (there may be ten companies in your city where java-signors are needed, but each has a different specialization in the subject area), and brilliant thought came to some bright minds: analyzing the subject area, formulating TK, and about what one person should do (business analyst, manager, technologist), and another person (programmer) to develop software to get the result.
Everyone was in the black. And this is good, and more and more companies are now working on this model. Just look at the resume on the headhunter sites - they are looking for exactly the "Senior developers of the microservice Java backend" or "ReactJS Middle developer", and "knowledge of the specifics of the banking sector" or "industry experience XXX" in Wishlist is indicated at best as "will be a plus ".
True, the concept “one writes algorithms and the other encodes them” has changed a little - on the one hand it has become easier, because in 90% of tasks today it’s more important not to invent a new algorithm or data storage structure, but to choose and make optimal use of existing concepts, or their modification for specific cases. But even without the "creation of algorithms" it is impossible to work in principle, because no one already formulates tasks of the form “allocate an array, make a loop for the passage element-by-element, etc.” (this is only encountered at school in computer science lessons), now the developer is working with information on “what is and what should be obtained”, developing a sequence of actions . In fact, even an elementary SQL query is already an algorithm.
That is why we can say that the division into " coders " and "programmers ”became obsolete 20 years ago, now these concepts are blurred and separation does not make sense.
But here, all the same, I want to somehow separate those who simply “invented the algorithm and expose it in the form of code” and those who are engaged in “software development”.
And here the old division comes in handy again. The one who simply invented the algorithm and writes code on it will be considered correctly enough to be a “ coder ”, but the one who is engaged not only in the creation of the algorithm and coding, but also in writing tests, documentation, elaborating the architecture and API, takes care of readability and reliability code, and takes part in many other processes, can be considered a " programmer ".
And what about the " software engineers"? As I said at the beginning, unlike in the old days, software development is not limited to engineering and technical tasks, and everyone who works with computers is no longer required to have a higher technical education. Nowadays, except for a" software engineer "and" mathematician “programmer” can be “chemist-programmer”, “financier-programmer”, “gamemaster-programmer” (role players will understand), and even “musician-programmer.” That is, in fact, this concept only indicates the scope of human tasks for what it is he has been programming.
And considering ka often the case in software development in the field of engineering:
“I’ll tell you a terrifying secret - embedded software is tested at least an order of magnitude less and worse than any withered web server. And dinosaurs often write it, a debugger is for wimps, and "if the code compiles, then everything works."
... I'm not joking, unfortunately. ”[ From comments ]
“No wonder. According to my observations, many hardware workers believe that manufacturing a device is an art subject to the elect, but he can write the code for it himself, on his knee. Well this is generally a trifle. It turns out working quiet horror. They are very offended when they explain to their fingers why their code smells bad, because ... well ... they did a piece of iron, what’s wrong, some kind of program. ”[ From comments ]
and scientific activities:
“From my own experience of scientific work, I can say that when one to several people work on a task, it doesn’t use speech code. They write how it turns out, use the minimum language features, most of them do not know about version control systems. ”[ From comments ]in many cases, the definition will sound more correctly “engineer-encoder” or “mathematician-encoder”.
If someone wants to offer other interpretations and names, I will be glad to see open and substantiated comments.